www.pudn.com > can¡ª¡ªSJA1000.rar > SJA_BCANFUNC.c
/* ******************************************************************************************************************** **ÃèÊö£º ¶ÀÁ¢µÄCAN ¿ØÖÆÆ÷SJA1000»ù±¾Ó²¼þÍ·Îļþ¶¨Òå(BasicCAN ¹¤×÷·½Ê½£© **ÎļþÃû: SJA_BcanFunc.H **Ó¦ÓÃÓïÑÔ: KEIL C51 **°æ±¾ : V1.0 **¹ãÖÝÖÜÁ¢¹¦µ¥Æ¬»ú·¢Õ¹ÓÐÏÞ¹«Ë¾ ±£ÁôËùÓеİæÈ¨ ******************************************************************************************************************** */ /*$page*/ #include "SJA_BCANCONF.H" #include/************************************************************************ *ÒÔÏÂΪ»ù±¾µÄº¯Êý˵Ã÷£¨BasicCAN) * ************************************************************************/ /************************************************************************ *º¯ÊýÔÐÍ: bit BCAN_CREATE_COMMUNATION(void) * *²ÎÊý˵Ã÷: ÎÞ * *·µ»ØÖµ: * * 0 ; ±íʾSJA1000½Ó¿ÚÕý³£ * * 1 ; ±íʾSJA1000Óë´¦ÀíÆ÷½Ó¿Ú²»Õý³£ * * * *˵Ã÷:¸Ãº¯ÊýÓÃÓÚ¼ì²âCAN¿ØÖÆÆ÷µÄ½Ó¿ÚÊÇ·ñÕý³£ * ************************************************************************/ bit BCAN_CREATE_COMMUNATION(void) { SJA_BCANAdr=REG_TEST; //·ÃÎʲâÊԼĴæÆ÷ *SJA_BCANAdr =0xaa; //дÈë²âÊÔÖµ if(*SJA_BCANAdr == 0xaa) { return 0; //¶Á²âÊÔÕýÈ· } else { return 1; } } /************************************************************************ *º¯ÊýÔÐÍ: bit BCAN_ENTER_RETMODEL(void) * *²ÎÊý˵Ã÷: ÎÞ * *·µ»ØÖµ: * * 0 ; ±íʾ³É¹¦½øÈ븴λ¹¤×÷ģʽ * * 1 ; ±íʾ²»ÄܽøÈ븴λ¹¤×÷ģʽ * * * *˵Ã÷: CAN¿ØÖÆÆ÷½øÈ븴λ¹¤×÷ģʽ * ************************************************************************/ bit BCAN_ENTER_RETMODEL(void) { unsigned char TempData; SJA_BCANAdr = REG_CONTROL; //·ÃÎʵØÖ·Ö¸Ïò¿ØÖƼĴæÆ÷ TempData= *SJA_BCANAdr; //±£´æÔʼֵ *SJA_BCANAdr=(TempData|0x01); //ÖÃλ¸´Î»ÇëÇó if((*SJA_BCANAdr&0x01) == 1) { return 0; } else { return 1; } } /************************************************************************ *º¯ÊýÔÐÍ: bit BCAN_QUIT_RETMODEL(void) * *²ÎÊý˵Ã÷: ÎÞ * *·µ»ØÖµ: * * 0 ; ±íʾ³É¹¦Í˳ö¸´Î»¹¤×÷ģʽ * * 1 ; ±íʾ²»ÄÜÍ˳ö¸´Î»¹¤×÷ģʽ * * * *˵Ã÷: CAN¿ØÖÆÆ÷Í˳ö¸´Î»¹¤×÷ģʽ * ************************************************************************/ bit BCAN_QUIT_RETMODEL(void) { unsigned char TempData; SJA_BCANAdr = REG_CONTROL; //·ÃÎʵØÖ·Ö¸Ïò¿ØÖƼĴæÆ÷ TempData = *SJA_BCANAdr; //±£´æÔʼֵ *SJA_BCANAdr=(TempData&0xfe); //Çå³ý¸´Î»ÇëÇó if((*SJA_BCANAdr&0x01) == 0) { return 0; // } else { return 1; //Í˳ö³É¹¦ } } /************************************************************************ ;*º¯ÊýÔÐÍ: bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate) * ;*²ÎÊý˵Ã÷: R7 ²¨ÌØÂÊ£¨Kbit/s£© BTR0 BTR1 * ;* 0 20 053H, 02FH * ;* 1 40 087H, 0FFH * ;* 2 50 047H, 02FH * ;* 3 80 083H, 0FFH * ;* 4 100 043H, 02fH * ;* 5 125 03H, 01cH * ;* 6 200 081H, 0faH * ;* 7 250 01H, 01cH * ;* 8 400 080H, 0faH * ;* 9 500 00H, 01cH * ;* 10 666 080H, 0b6H * ;* 11 800 00H, 016H * ;* 12 1000 00H, 014H * ;*·µ»ØÖµ: * ;* 0 ;²¨ÌØÂÊÉèÖóɹ¦ * ;* 1 ;²¨ÌØÂÊÉèÖÃʧ°Ü * ;* * ;*˵Ã÷:ÉèÖÃCAN¿ØÖÆÆ÷SJA1000ͨѶ²¨ÌØÂÊ.SJA1000µÄ¾§ÕñΪ±ØÐëΪ16MHZ, * ;* ÆäËü¾§ÌåµÄƵÂʵÄÖµµÄ²¨ÌØÂÊ£¬Ðè×Ô¼º¼ÆËã ¡£¸Ã×Ó³ÌÐòÖ»ÄÜÓÃÓÚ * ;* ¸´Î»Ä£Ê½ * ;************************************************************************/ unsigned char code SJA_BTR_CODETAB[]={ 0x53,0x2F, // ;20KBPSµÄÔ¤ÉèÖµ 0x87,0xFF, //;40KBPSµÄÔ¤ÉèÖµ 0x47,0x2F, //;50KBPSµÄÔ¤ÉèÖµ 0x83,0xFF, //;80KBPSµÄÔ¤ÉèÖµ 0x43,0x2f, //;100KBPSµÄÔ¤ÉèÖµ 0x03,0x1c, //;125KBPSµÄÔ¤ÉèÖµ 0x81,0xfa, //;200KBPSµÄÔ¤ÉèÖµ 0x01,0x1c, //;250KBPSµÄÔ¤ÉèÖµ 0x80,0xfa, //;400KBPSµÄÔ¤ÉèÖµ 0x00,0x1c, //;500KBPSµÄÔ¤ÉèÖµ 0x80,0xb6, //;666KBPSµÄÔ¤ÉèÖµ 0x00,0x16, //;800KBPSµÄÔ¤ÉèÖµ 0x00,0x14 //;1000KBPSµÄÔ¤ÉèÖµ }; bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate) { unsigned char BTR0_num,BTR1_num; BTR0_num = SJA_BTR_CODETAB[CAN_ByteRate*2]; BTR1_num = SJA_BTR_CODETAB[CAN_ByteRate*2+1]; //½«²¨ÌØÂʵĵÄÔ¤ÉèÖµ×°Èësja1000µÄ×ÜÏß¶¨Ê±Æ÷ SJA_BCANAdr=REG_BTR0; //·ÃÎʵØÖ·Ö¸Ïò×ÜÏß¶¨Ê±¼Ä´æÆ÷0 *SJA_BCANAdr=BTR0_num; //дÈë²ÎÊý if(*SJA_BCANAdr != BTR0_num) //УÑéдÈëÖµ { return 1; } SJA_BCANAdr=REG_BTR1; //·ÃÎʵØÖ·Ö¸Ïò×ÜÏß¶¨Ê±¼Ä´æÆ÷0 *SJA_BCANAdr=BTR1_num; //дÈë²ÎÊý if(*SJA_BCANAdr != BTR1_num) //УÑéдÈëÖµ { return 1; } return 0; } /************************************************************************ ;*º¯ÊýÔÐÍ: BCAN_SET_OBJECT * *²ÎÊý˵Ã÷: * * BCAN_ACR:´æ·ÅÑéÊÕ´úÂë¼Ä´æÆ÷£¨ACR£©µÄ²ÎÊýÉèÖà * * BCAN_AMR:´æ·Å½ÓÊÕÆÁ±Î¼Ä´æÆ÷£¨AMR£©µÄ²ÎÊýÉèÖà * ;*·µ»ØÖµ: * ;* 0 ;ͨÐŶÔÏóÉèÖóɹ¦ * ;* 1 ;ͨÐŶÔÏóÉèÖÃʧ°Ü * ;* * ;*˵Ã÷:ÉèÖÃCAN½ÚµãµÄͨѶ¶ÔÏó£¬ÔÊÐí½ÓÊյı¨ÎÄIDºÅµÄ¸ß8λ(D10--D3) ¡£ * ;* ÔÊÐí½ÓÊյı¨ÎÄ,ÊÇÓÉAMRºÍACR¹²Í¬¾ö¶¨µÄ. * ;* Âú×ãÒÔÏÂÌõ¼þµÄIDºÅµÄ±¨ÎIJſÉÒÔ±»½ÓÊÕ * ;*[£¨ID.10-ID.3£©¡Ô£¨AC.7-AC.0£©]||£¨AM.7-AM.0£©¡Ô11111111 * ;* ¸Ã×Ó³ÌÐòÖ»ÄÜÓÃÓÚ¸´Î»Ä£Ê½ * * ;************************************************************************/ bit BCAN_SET_OBJECT(unsigned char BCAN_ACR,unsigned char BCAN_AMR) { SJA_BCANAdr=REG_ACR; //·ÃÎʵØÖ·Ö¸ÏòÑéÊÕ´úÂë¼Ä´æÆ÷(ACR) *SJA_BCANAdr=BCAN_ACR; //дÈë²ÎÊý if(*SJA_BCANAdr != BCAN_ACR) //УÑéдÈëÖµ { return 1; } SJA_BCANAdr=REG_AMR; //·ÃÎʵØÖ·Ö¸ÏòÑéÊÕÆÁ±Î¼Ä´æÆ÷(AMR) *SJA_BCANAdr=BCAN_AMR; //дÈë²ÎÊý if(*SJA_BCANAdr != BCAN_AMR) //УÑéдÈëÖµ { return 1; } return 0; } /************************************************************************ ;*º¯ÊýÔÐÍ: bit BCAN_SET_OUTCLK (unsigned char Out_Control, * unsigned char Clock_Out); * ;*²ÎÊý˵Ã÷: * * Out_Control:´æ·ÅÊä³ö¿ØÖƼĴæÆ÷ (OC) µÄ²ÎÊýÉèÖà * * Clock_Out:´æ·ÅʱÖÓ·ÖÆµ¼Ä´æÆ÷ (CDR) µÄ²ÎÊýÉèÖà * * * ;*·µ»ØÖµ: * ;* 0 ;ÉèÖóɹ¦ * ;* 1 ;ÉèÖÃʧ°Ü * ;* * ;*˵Ã÷:ÉèÖÃSJA1000µÄÊä³öģʽºÍʱÖÓ·ÖÆµ ¡£¸Ã×Ó³ÌÐòÖ»ÄÜÓÃÓÚ¸´Î»Ä£Ê½ * * ;************************************************************************/ bit BCAN_SET_OUTCLK (unsigned char Out_Control, unsigned char Clock_Out) { SJA_BCANAdr=REG_OCR ; //·ÃÎʵØÖ·Ö¸ÏòÊä³ö¿ØÖƼĴæÆ÷ *SJA_BCANAdr=Out_Control; //дÈë²ÎÊý if(*SJA_BCANAdr != Out_Control) //УÑéдÈëÖµ { return 1; } SJA_BCANAdr=REG_CDR; //·ÃÎʵØÖ·Ö¸ÏòÊä³ö¿ØÖƼĴæÆ÷ *SJA_BCANAdr=Clock_Out; //дÈë²ÎÊý return 0; } /************************************************************************ *º¯ÊýÔÐÍ: bit BCAN_HW_INIT(unsigned char BCAN_ACR, * * unsigned char BCAN_AMR, * * unsigned char Bus_Timing0, * * unsigned char Bus_Timing1, * * unsigned char Out_Control, * * unsigned char Clock_Out * * ) * *²ÎÊý˵Ã÷: * * BCAN_ACR:´æ·ÅÑéÊÕ´úÂë¼Ä´æÆ÷£¨ACR£©µÄ²ÎÊýÉèÖà * * BCAN_AMR:´æ·Å½ÓÊÕÆÁ±Î¼Ä´æÆ÷£¨AMR£©µÄ²ÎÊýÉèÖà * * Bus_Timing0:´æ·Å×ÜÏß¶¨Ê±0¼Ä´æÆ÷(BTR0)µÄ²ÎÊýÉèÖà * * Bus_Timing1:´æ·Å×ÜÏß¶¨Ê±1¼Ä´æÆ÷(BTR1)µÄ²ÎÊýÉèÖà * * Out_Control:´æ·ÅÊä³ö¿ØÖƼĴæÆ÷ (OC) µÄ²ÎÊýÉèÖà * * Clock_Out:´æ·ÅʱÖÓ·ÖÆµ¼Ä´æÆ÷ (CDR) µÄ²ÎÊýÉèÖà * * * *·µ»ØÖµ: * * 0 ; ±íʾ³õʼ»¯³É¹¦ * * 1 ; ±íʾ³õʼ»¯Ê§°Ü * * * *˵Ã÷:CAN¿ØÖÆÆ÷µÄ³õʼ»¯Ö»ÄÜÔÚ¸´Î»Ä£Ê½Ï²ÅÄÜÍê³É¡£³õʼ»¯²Ù×÷֮ǰÇëÏȽøÈë* * µ½¸´Î»²Ù×÷ģʽ,²¢½«Òª³õʼ»¯µÄ¸÷²ÎÊýµÄÖµ°´Êý¾ÝÊÖ²áÖеļÆËã·½·¨,Õý * * È·µÄ°´Êµ¼ÊÐèÒª¼ÆËãºÃ²ÎÊýºó£¬½«²ÎÊýдÈë¶ÔÓ¦µÄ¼Ä´æÆ÷ ¡£ * *×¢£º ΪÁËCAN¿ØÖÆÆ÷µÄÕýÈ·ÔËÐУ¬ÇëÎñ±Ø×ÐϸµÄÔĶÁSJA1000µÄÊý¾ÝÊÖ²á * * * *ʾÀý£ºÉèÓ¦ÓÃϵͳÖо§Ì寵ÂÊ16MHZ£¬½ÚµãÖ»½ÓÊÕID(±êÖ¾·û£©¸ß°ËλΪ * * '10101010'µÄÏûÏ¢£¬ÏµÍ³²¨ÌØÂÊΪ50Kbit/s,¹Ø±ÕCLKOUTÊä³ö¡£ * * Ôò¸ù¾ÝÊý¾ÝÊÖ²áÖеļÆËã·½·¨µÄ¸÷²ÎÊýÈçÏ£º * * ACR==0AAH,AMR==00H,BTR0==0C9H,BTR1==0C9H,OC==0FFH,CDR=48H * * Ôòµ÷Óñ¾º¯ÊýΪ£º * * BCAN_HW_INIT(0xaa,0x00,0xc9,0xc9,0xff,0x48) * ************************************************************************ bit BCAN_HW_INIT(unsigned char BCAN_ACR, unsigned char BCAN_AMR, unsigned char Bus_Timing0, unsigned char Bus_Timing1, unsigned char Out_Control, unsigned char Clock_Out ) { SJA_BCANAdr=REG_ACR; //·ÃÎʵØÖ·Ö¸ÏòÑéÊÕ´úÂë¼Ä´æÆ÷(ACR) *SJA_BCANAdr=BCAN_ACR; //дÈë²ÎÊý if(*SJA_BCANAdr != BCAN_ACR) //УÑéдÈëÖµ { return 1; } SJA_BCANAdr=REG_AMR; //·ÃÎʵØÖ·Ö¸ÏòÑéÊÕÆÁ±Î¼Ä´æÆ÷(AMR) *SJA_BCANAdr=BCAN_AMR; //дÈë²ÎÊý if(*SJA_BCANAdr != BCAN_AMR) //УÑéдÈëÖµ { return 1; } SJA_BCANAdr=REG_BTR0; //·ÃÎʵØÖ·Ö¸Ïò×ÜÏß¶¨Ê±¼Ä´æÆ÷0 *SJA_BCANAdr=Bus_Timing0; //дÈë²ÎÊý if(*SJA_BCANAdr != Bus_Timing0)//УÑéдÈëÖµ { return 1; } SJA_BCANAdr=REG_BTR1; //·ÃÎʵØÖ·Ö¸Ïò×ÜÏß¶¨Ê±¼Ä´æÆ÷0 *SJA_BCANAdr=Bus_Timing1; //дÈë²ÎÊý if(*SJA_BCANAdr != Bus_Timing1)//УÑéдÈëÖµ { return 1; } SJA_BCANAdr=REG_OCR ; //·ÃÎʵØÖ·Ö¸ÏòÊä³ö¿ØÖƼĴæÆ÷ *SJA_BCANAdr=Out_Control; //дÈë²ÎÊý if(*SJA_BCANAdr != Out_Control)//УÑéдÈëÖµ { return 1; } SJA_BCANAdr=REG_CDR; //·ÃÎʵØÖ·Ö¸ÏòÊä³ö¿ØÖƼĴæÆ÷ *SJA_BCANAdr=Clock_Out; //дÈë²ÎÊý return 0; } /************************************************************************ *º¯ÊýÔÐÍ: bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)* *²ÎÊý˵Ã÷: ÌØ¶¨Ö¡¸÷ʽµÄÊý¾Ý· * *·µ»ØÖµ: * * 0 ; ±íʾ½«Êý¾Ý³É¹¦µÄËÍÖÁ·¢ËÍ»º³åÇø * * 1 ; ±íʾÉÏÒ»´ÎµÄÊý¾ÝÕýÔÚ·¢ËÍ£¬ * * ; ±íʾ·¢ËÍ»º³åÇø±»Ëø¶¨£¬²»ÄÜдÈëÊý¾Ý * * ; ±íʾдÈëÊý¾Ý´íÎó * *˵Ã÷: ½«´ý·¢ËÍÌØ¶¨Ö¡¸÷ʽµÄÊý¾Ý£¬ËÍÈëSJA1000·¢ËÍ»º´æÇøÖУ¬È»ºóÆô¶¯ * * SJA1000·¢ËÍ¡£ * * ÌØ¶¨Ö¡¸ñʽΪ:¿ªÊ¼µÄÁ½¸ö×Ö½Ú´æ·Å 'ÃèÊö·û' ,ÒÔºóµÄΪÊý¾Ý * * ÃèÊö·û°üÀ¨11볤µÄID(±êÖ¾·û£©\1λRTR\4λÃèÊöÊý¾Ý³¤¶ÈµÄDLC¹²16λ * * * *×¢£º±¾º¯ÊýµÄ·µ»ØÖµ½öָʾ£¬½«Êý¾ÝÕýȷдÈëSJA1000·¢ËÍ»º´æÇøÖÐÓë·ñ¡£ * * ²»Ö¸Ê¾SJA1000½«¸ÃÊý¾ÝÕýÈ··¢Ë͵½CAN×ÜÏßÉÏÍê±ÏÓë·ñ * ************************************************************************/ bit BCAN_DATA_WRITE(unsigned char *SendDataBuf) { unsigned char TempCount; SJA_BCANAdr = REG_STATUS; //·ÃÎʵØÖ·Ö¸Ïò״̬¼Ä´æÆ÷ if((*SJA_BCANAdr&0x08) == 0) //ÅжÏÉϴη¢ËÍÊÇ·ñÍê³É { return 1; } if((*SJA_BCANAdr&0x04)==0) //ÅжϷ¢ËÍ»º³åÇøÊÇ·ñËø¶¨ { return 1; } SJA_BCANAdr = REG_TxBuffer1; //·ÃÎʵØÖ·Ö¸Ïò·¢ËÍ»º³åÇø1 if((SendDataBuf[1]&0x10)==0) //ÅжÏRTR£¬´Ó¶øµÃ³öÊÇÊý¾ÝÖ¡»¹ÊÇÔ¶³ÌÖ¡ { TempCount =(SendDataBuf[1]&0x0f)+2; //ÊäÈëÊý¾ÝÖ¡ } else { TempCount =2; //Ô¶³ÌÖ¡ } memcpy(SJA_BCANAdr,SendDataBuf,TempCount); return 0; } /************************************************************************ *º¯ÊýÔÐÍ: bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf); * *²ÎÊý˵Ã÷: RcvDataBuf,´æ·Å΢´¦ÀíÆ÷±£´æÊý¾Ý»º³åÇø * *·µ»ØÖµ: 0;½ÓÊճɹ¦ * * 1;½ÓÊÕʧ°Ü * *˵Ã÷:CAN¿ØÖÆÆ÷½ÓÊÕÊý¾Ý,½öÏÞÓÚ½ÓÊÕÊý¾Ý * ************************************************************************/ bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf) { unsigned char TempCount; SJA_BCANAdr = REG_STATUS; //·ÃÎʵØÖ·Ö¸Ïò״̬¼Ä´æÆ÷ if((*SJA_BCANAdr&0x01)==0) //Åжϱ¨ÎÄÊÇ·ñÓÐЧ { return 1; } SJA_BCANAdr = REG_RxBuffer2; //·ÃÎʵØÖ·Ö¸Ïò½ÓÊÕ»º³åÇø2 if((*SJA_BCANAdr&0x10)==0) //Èç¹ûÊÇÊý¾ÝÖ¡ { TempCount=(*SJA_BCANAdr&0x0f)+2; //¼ÆË㱨ÎÄÖÐÊý¾ÝµÄ¸öÊý } else { TempCount=2; } SJA_BCANAdr = REG_RxBuffer1; //·ÃÎʵØÖ·Ö¸Ïò½ÓÊÕ»º³åÇø1 memcpy(RcvDataBuf,SJA_BCANAdr,TempCount);//¶ÁÈ¡½ÓÊÕ»º³åÇøµÄ±¨ÎÄ return 0; } /************************************************************************ *º¯ÊýÔÐÍ: bit BCAN_CMD_PRG(unsigned char cmd) * *²ÎÊý˵Ã÷: cmd:sja1000ÔËÐеÄÃüÁî×Ö * * 01:·¢ËÍÇëÇó * * 02£ºÖÐÖ¹·¢ËÍ * * 04£ºÊͷŽÓÊÕ»º³åÇø * * 08£ºÇå³ý³¬ÔØ×´Ì¬ * * 0x10:½øÈë˯Ãß״̬ * * * *·µ»ØÖµ: * * 0 ; ±íʾÃüÁîÖ´Ðгɹ¦ * * 1 ; ±íʾÃüÁîÖ´ÐÐʧ°Ü * * * *˵Ã÷: Ö´ÐÐsja1000ÃüÁî * ************************************************************************/ bit BCAN_CMD_PRG(unsigned char cmd) { SJA_BCANAdr=REG_COMMAND; //·ÃÎʵØÖ·Ö¸ÏòÃüÁî¼Ä´æÆ÷ *SJA_BCANAdr=cmd; //Æô¶¯ÃüÁî×Ö switch(cmd) { case TR_CMD: //·¢ËÍÇëÇóÃüÁî return 0; break; case AT_CMD: //زÕÛ·¢ËÍÃüÁî SJA_BCANAdr = REG_STATUS; //·ÃÎʵØÖ·Ö¸Ïò״̬¼Ä´æÆ÷ if((*SJA_BCANAdr & 0x20)==0)//ÅжÏÊÇ·ñÕýÔÚ·¢ËÍ { return 0; } else { return 1; } break; case RRB_CMD: //ÊͷŽÓÊÕ»º³åÇø SJA_BCANAdr = REG_STATUS; //·ÃÎʵØÖ·Ö¸Ïò״̬¼Ä´æÆ÷ if((*SJA_BCANAdr & 0x01)==1)//ÅжÏÊÇ·ñÊͷųɹ¦ { return 1; } else { return 0; } break; case COS_CMD: //Çå³ý³¬ÔØ×´Ì¬ SJA_BCANAdr = REG_STATUS; //·ÃÎʵØÖ·Ö¸Ïò״̬¼Ä´æÆ÷ if((*SJA_BCANAdr & 0x02)==0)//ÅжÏÇå³ý³¬ÔØÊÇ·ñ³É¹¦ { return 0; } else { return 1; } break; case GTS_CMD: //½øÈë˯Ãß״̬ÃüÁî return 0; break; default: return 1; break; } }