sja1000 中断_SJA1000PeliCAN模式下自收发问题
/*************************************************************************MCU:ATmega16MCLK:內(nèi)部震蕩8M熔絲位:低14高48CAN總線模塊:獨(dú)立可編程CAN芯片SJA1000CAN模塊晶振:16M功能說明:自收發(fā):按下key,1602第一行顯示按下的次數(shù),然后作為報(bào)文數(shù)據(jù)發(fā)送,? ?? ?? ? 再由節(jié)點(diǎn)本身自己接收,并將接收的數(shù)據(jù)顯示在第二行。接線說明:A0-A7口對(duì)應(yīng)接SJA1000八位地址/數(shù)據(jù)線? ?? ?? ? C2-C7口接控制線? ? ? ? ? ? ? ?? ?D2口接SJA1000INT0,D3口接外部按鍵key**************************************************************************/#include #include #include"yanshi.c"//提供ms和us延時(shí)函數(shù)#include"1602.c"//1602顯示函數(shù)#define??uchar unsigned char#define??uint??unsigned int#define mclk 8000000//8M晶振#pragma interrupt_handler can_rxd:2//外部中斷INT0申明#pragma interrupt_handler key:3//外部中斷INT1申明#pragma interrupt_handler usart_recieve:12//串口中斷申明/*************************************************************************功能說明:SJA1000控制引腳定義**************************************************************************//*模塊CANTest指示燈 pc2,高電平亮*/#define LED_H PORTC|=BIT(2)#define LED_L PORTC&=~BIT(2)/*SJA1000的RST信號(hào)線 PC3,低電平有效*/#define SJA_RST_H PORTC|=BIT(3)#define SJA_RST_L PORTC&=~BIT(3)/*SJA1000的WR信號(hào)線 PC4,低電平有效*/#define SJA_WR_H PORTC|=BIT(4)#define SJA_WR_L PORTC&=~BIT(4)/*SJA1000的RD信號(hào)線 PC5,低電平有效*/#define SJA_RD_H PORTC|=BIT(5)#define SJA_RD_L PORTC&=~BIT(5)/*SJA1000的CS信號(hào)線 PC6,低電平有效*/#define SJA_CS_H PORTC|=BIT(6)#define SJA_CS_L PORTC&=~BIT(6)/*SJA1000的ALE信號(hào)線 PC7,高電平有效*/#define SJA_ALE_H PORTC|=BIT(7)#define SJA_ALE_L PORTC&=~BIT(7)/*SJA1000的INT0信號(hào)線 PD2,外部中斷INT0*/#define SJA_INT_H PORTD|=BIT(2)#define SJA_INT_L PORTD&=~BIT(2)/*SJA1000的KEY信號(hào)線 PD3,外部中斷INT1*/#define SJA_KEY_H PORTD|=BIT(3)#define SJA_KEY_L PORTD&=~BIT(3)/*************************************************************************功能說明:SJA1000內(nèi)部寄存器地址定義,各寄存器具體功能參閱SJA1000數(shù)據(jù)手冊注意事項(xiàng):不可隨意修改模式:PeliCAN模式和擴(kuò)展幀EFF模式描述符配置說明:BIT7:1,EFF:擴(kuò)展幀格式? ? ? ? ? ? ? ? ? ? ? ?? ?? ?? ???0,SFF:標(biāo)準(zhǔn)幀格式? ? ? ? ? ? ? ? ? ? ? ?? ???BIT6:1,遠(yuǎn)程幀? ? ? ? ? ? ? ? ? ? ? ?? ?? ?? ???0,數(shù)據(jù)幀? ? ? ? ? ? ? ? ? ? ? ?? ???BIT3-0:數(shù)據(jù)長度代碼**************************************************************************/#define? ???MODR? ?? ?0x00 //模式寄存器#define? ???CMR? ?? ? 0x01 //命令寄存器#define? ???SR? ?? ???0x02 //狀態(tài)寄存器#define? ???IR? ?? ???0x03 //中斷寄存器#define? ???IER? ?? ? 0x04 //中斷使能寄存器#define? ???BTR0? ?? ?0x06 //總線定時(shí)寄存器0#define? ???BTR1? ?? ?0x07 //總線定時(shí)寄存器1#define? ???OCR? ?? ? 0x08 //輸出控制寄存器#define? ???TEST? ?? ?0x09 //測試寄存器#define? ???ALC? ?? ? 0x0B //仲裁丟失捕捉#define? ???ECC? ?? ? 0x0C //錯(cuò)誤代碼捕捉#define? ???EWLR? ?? ?0x0D //錯(cuò)誤報(bào)警限額#define? ???RXERR? ???0x0E //接收錯(cuò)誤計(jì)數(shù)器#define? ???TXERR? ???0x0F //發(fā)送錯(cuò)誤計(jì)數(shù)器/*驗(yàn)收代碼寄存器*/#define? ???ACR0? ?? ?0x10#define? ???ACR1? ?? ?0x11#define? ???ACR2? ?? ?0x12#define? ???ACR3? ?? ?0x13/*驗(yàn)收屏蔽寄存器*/#define? ???AMR0? ?? ?0x14#define? ???AMR1? ?? ?0x15#define? ???AMR2? ?? ?0x16#define? ???AMR3? ?? ?0x17/*發(fā)送緩沖區(qū)寄存器*/#define? ???TBSR0? ???0x10 //TX描述符#define? ???TBSR1? ???0x11 //TX標(biāo)識(shí)符1#define? ???TBSR2? ???0x12 //TX標(biāo)識(shí)符2#define? ???TBSR3? ???0x13 //TX標(biāo)識(shí)符3#define? ???TBSR4? ???0x14 //TX標(biāo)識(shí)符4#define? ???TBSR5? ???0x15 //TX數(shù)據(jù)1#define? ???TBSR6? ???0x16 //TX數(shù)據(jù)2#define? ???TBSR7? ???0x17 //TX數(shù)據(jù)3#define? ???TBSR8? ???0x18 //TX數(shù)據(jù)4#define? ???TBSR9? ???0x19 //TX數(shù)據(jù)5#define? ???TBSR10? ? 0x1A //TX數(shù)據(jù)6#define? ???TBSR11? ? 0x1B //TX數(shù)據(jù)7#define? ???TBSR12? ? 0x1C //TX數(shù)據(jù)8// 接收緩沖區(qū)寄存器#define? ???RBSR? ?? ?0x10 //RX描述符#define? ???RBSR1? ???0x11 //RX標(biāo)識(shí)符1#define? ???RBSR2? ???0x12 //RX標(biāo)識(shí)符2#define? ???RBSR3? ???0x13 //RX標(biāo)識(shí)符3#define? ???RBSR4? ???0x14 //RX標(biāo)識(shí)符4#define? ???RBSR5? ???0x15 //RX數(shù)據(jù)1#define? ???RBSR6? ???0x16 //RX數(shù)據(jù)2#define? ???RBSR7? ???0x17 //RX數(shù)據(jù)3#define? ???RBSR8? ???0x18 //RX數(shù)據(jù)4#define? ???RBSR9? ???0x19 //RX數(shù)據(jù)5#define? ???RBSR10? ? 0x1A //RX數(shù)據(jù)6#define? ???RBSR11? ? 0x1B //RX數(shù)據(jù)7#define? ???RBSR12? ? 0x1C //RX數(shù)據(jù)8#define? ???RMC? ?? ? 0x1D //RX報(bào)文計(jì)數(shù)器#define? ???RBSA? ?? ?0x1E //接收緩沖區(qū)起始地址#define? ???CDR? ?? ? 0x1F //時(shí)鐘分頻寄存器/*************************************************************************功能說明:子函數(shù)定義**************************************************************************/void init_mcu(void);//MCU初始化函數(shù)void rxd_deal(void);//接收函數(shù)void txd_deal(void);//發(fā)送函數(shù)void can_txd(void);//發(fā)送擴(kuò)展數(shù)據(jù)幀void init_INT(void);//外部中斷初始化void SJA1000_WRITE(uchar ADDRESS,uchar A_DATA);//控制SJA1000寫入一個(gè)數(shù)據(jù)uchar SJA1000_READ(uchar ADDRESS);//控制SJA1000讀出一個(gè)數(shù)據(jù)void init_SJA1000_HardWare(void);//SJA1000硬件復(fù)位uchar init_SJA1000_Soft(void);//SJA1000軟件復(fù)位void usart_init(uint baud);//串口初始化void usart_transmit(uchar data); //發(fā)送數(shù)據(jù)void usart_recieve(void); //接收數(shù)據(jù)/*************************************************************************功能說明:全局變量定義**************************************************************************/#define N_can 13//定義常數(shù)代表一幀字節(jié)uchar TXD_flag=0;//發(fā)送標(biāo)志,置一時(shí)請求發(fā)送uchar RXD_flag=0;//接收標(biāo)志,置一時(shí)有數(shù)據(jù)可以接收uchar TX_buffer[13];//發(fā)送數(shù)據(jù)緩沖區(qū)uchar RX_buffer[13];//接收數(shù)據(jù)緩沖區(qū)uchar Txd_data=0;//CAN總線要發(fā)送的數(shù)據(jù)uchar Rxd_data=0;//CAN總線要接收的數(shù)據(jù)uchar TempData;uchar rdata,flag=0;uchar num[]="0123456789ABCDEF";/*************************************************************************功能說明:MCU初始化**************************************************************************/void init_mcu(void){??DDRA=0XFF;//定義地址/數(shù)據(jù)線接口輸出??DDRC=0XFF;//定義控制線輸出??usart_init(9600);//串口初始化,波特率采用9600??init_INT();//外部中斷INT0、INT1初始化}/*************************************************************************功能說明:串口初始化**************************************************************************/void usart_init(uint baud){??uint i;??UCSRA=0X00;??UCSRB=0X00;??UCSRC=0X86;//1000 0110異步模式、一位停止位、8位字符? ? i=mclk/16/baud-2;??UBRRL=i;//16為的數(shù)據(jù)只有低八位賦給了寄存器??UBRRH=i>>8;? ? UCSRB=0X98;//1001 1000接收結(jié)束中斷使能、接收和發(fā)送使能??SREG=BIT(7);//全局中斷使能}/*************************************************************************功能說明:串口發(fā)送數(shù)據(jù)**************************************************************************/void usart_transmit(uchar data) //發(fā)送數(shù)據(jù){??while(!(UCSRA&BIT(5)));//等待寄存器空??UDR=data;//寫入U(xiǎn)DR也就是發(fā)送TXB??while(!(UCSRA&BIT(6)));//等待發(fā)送完畢??UCSRA|=BIT(6);//清空UDR}/*************************************************************************功能說明:串口接收數(shù)據(jù)**************************************************************************/void usart_recieve(void) //接收數(shù)據(jù){??UCSRB&=~BIT(7);//關(guān)閉接收結(jié)束中斷使能,防止干擾??rdata=UDR;//讀UDR的值也就是是接收RXD??flag=1;??UCSRB|=BIT(7);//恢復(fù)接收結(jié)束中斷使能}/*************************************************************************功能說明:外部中斷初始化**************************************************************************/void init_INT(void){??MCUCR=0X0A;//下降沿產(chǎn)生中斷??GICR=0XC0;//使能INT0、INT1??SREG|=BIT(7);//全局中斷使能}/*************************************************************************功能說明:CPU中斷接收服務(wù)程序(外部中斷INT0)**************************************************************************/void can_rxd(void){??uchar state;??GICR=0X00;//關(guān)閉INT0、INT1中斷??state=SJA1000_READ(IR);//讀sja1000中斷寄存器??usart_transmit(state);??delay(10);??IF(state&0x01)??{? ? RX_buffer[0]=SJA1000_READ(RBSR);? ? delay(1);? ? ? ? RX_buffer[1]=SJA1000_READ(RBSR1);? ? delay(1);? ? ? ? RX_buffer[2]=SJA1000_READ(RBSR2);? ? delay(1);? ? ? ? RX_buffer[3]=SJA1000_READ(RBSR3);? ? delay(1);? ? ? ? RX_buffer[4]=SJA1000_READ(RBSR4);? ? delay(1);? ? ? ? RX_buffer[5]=SJA1000_READ(RBSR5);? ? delay(1);? ? ? ? RX_buffer[6]=SJA1000_READ(RBSR6);? ? delay(1);? ? ? ? RX_buffer[7]=SJA1000_READ(RBSR7);? ? delay(1);? ? ? ? RX_buffer[8]=SJA1000_READ(RBSR8);? ? delay(1);? ? ? ? RX_buffer[9]=SJA1000_READ(RBSR9);? ? delay(1);? ? ? ? RX_buffer[10]=SJA1000_READ(RBSR10);? ? delay(1);? ? ? ? RX_buffer[11]=SJA1000_READ(RBSR11);? ? delay(1);? ? ? ? RX_buffer[12]=SJA1000_READ(RBSR12);? ? delay(1);? ? ? ? RXD_flag=1;//接收標(biāo)志置位? ? ? ? SJA1000_WRITE(CMR,0X04);//釋放接收緩沖器? ? ? ? state=SJA1000_READ(ALC);? ? ? ? state=SJA1000_READ(ECC);??}??SJA1000_WRITE(IER,0X01);//接收中斷使能??GICR=0XC0;//使能INT0、INT1}/*************************************************************************功能說明:按鍵外部中斷INT1服務(wù)程序**************************************************************************/void key(void){??GICR=0X00;//關(guān)閉INT0、INT1中斷??Txd_data++;??TXD_flag=1;??GICR=0XC0;//使能INT0、INT1}/*******************************************************************************函數(shù)名稱: void SJA1000_WRITE(unsigned char ADDRESS,unsigned char A_DATA)功能說明: 該函數(shù)用于can控制器寫入一個(gè)數(shù)據(jù)輸入?yún)?shù): unsigned char ADDRESS: 地址unsigned char A_DATA: 數(shù)據(jù)*******************************************************************************/void SJA1000_WRITE(uchar ADDRESS,uchar A_DATA){??delay_us(2);??SJA_ALE_H;//ALE=1鎖存地址??delay(10);??DDRA=0XFF; //數(shù)據(jù)口為輸出??PORTA=ADDRESS;//輸出地址數(shù)據(jù)??delay(10);??SJA_ALE_L;//地址鎖存??SJA_CS_L;//低電平允許訪問SJA1000??SJA_WR_L;//寫入,低電平有效??delay(10);??PORTA=A_DATA; //輸出數(shù)據(jù)??delay(10);??SJA_WR_H;//關(guān)閉寫}/*****************************************************************************函數(shù)名稱: unsigned char SJA1000_READ(unsigned char ADDRESS)功能說明: 該函數(shù)用于CAN控制器讀出一個(gè)數(shù)據(jù)輸入?yún)?shù): unsigned char ADDRESS: 地址輸出參數(shù): 讀出的數(shù)據(jù)*****************************************************************************/uchar SJA1000_READ(uchar ADDRESS){??uchar data;??delay_us(2);??SJA_ALE_H;//ALE=1??delay(10);??DDRA=0XFF; //數(shù)據(jù)口為輸出??PORTA=ADDRESS; //輸出數(shù)據(jù)的地址??delay(10);??SJA_ALE_L;//ALE=0??SJA_CS_L;//低電平允許訪問SJA1000??SJA_RD_L;//讀出,低電平有效??delay(10);??DDRA=0X00; //數(shù)據(jù)口為輸入??PORTA=0XFF; //上拉??delay(10);??data=PINA; //獲得數(shù)據(jù)??delay(10);??SJA_RD_H;//關(guān)讀取??return data;//將讀到的數(shù)據(jù)返回}/******************************************************************************函數(shù)名稱: void init_SJA1000_HardWare(void)功能說明: SJA1000硬件初始化系統(tǒng)******************************************************************************/void init_SJA1000_HardWare(void){??delay(100);??SJA_RST_L; // SJA1000的RST信號(hào)線(低電平有效)??delay(100);??SJA_RST_H; // SJA1000的RST信號(hào)線(低電平有效)??delay(100); // 復(fù)位延時(shí),保證可靠復(fù)位}/****************************************************************************函數(shù)名稱: void init_SJA1000_Soft(void)功能說明: SJA1000軟件初始化系統(tǒng)****************************************************************************/uchar init_SJA1000_Soft(void){??do // SJA1000控制: 復(fù)位模式??{? ? DDRC&=~BIT(3);? ? ? ? SJA_RST_H; // SJA1000的RST信號(hào)線(低電平有效)? ? delay(100); // 復(fù)位延時(shí),保證可靠復(fù)位? ? ? ? SJA1000_WRITE(MODR,0X09);//MODR=0X00;控制寄存器? ? ? ? TempData = SJA1000_READ(MODR);??}??while((TempData&0X1F)!= 0x09);? ? /*測試SJA1000的通信狀態(tài)*/??SJA1000_WRITE(TEST,0X55); //訪問測試寄存器寫入測試值??TempData = SJA1000_READ(TEST);? ? /*初始化時(shí)分控制器: PeilCAN模式、clockOFF禁止*/??SJA1000_WRITE(CDR,0X88); // 時(shí)分控制寄存器? ? /*設(shè)置輸出控制器*/? ?SJA1000_WRITE(OCR,0XAA); // 訪問地址指向輸出控制寄存器? ? /*波特率: bps = 10K*/??SJA1000_WRITE(BTR0,0X31); // 訪問地址指向總線定時(shí)寄存器0??SJA1000_WRITE(BTR1,0X1C); // 訪問地址指向總線定時(shí)寄存器? ? /*中斷控制: 接收中斷*/??SJA1000_WRITE(IER,0X01); // 訪問中斷使能控制? ? /*命令寄存器只寫*/??SJA1000_WRITE(CMR,0X04); //釋放接收緩沖區(qū)??delay(100);??SJA1000_WRITE(CMR,0X08); //數(shù)據(jù)溢出清除命令??delay(100);? ? /*設(shè)置濾波器,地址為本地的IP前29位,全無關(guān)*/??SJA1000_WRITE(ACR0,0X11); // 驗(yàn)收代碼寄存器(ACR1)??SJA1000_WRITE(ACR1,0X22); // 驗(yàn)收代碼寄存器(ACR2)??SJA1000_WRITE(ACR2,0X33); // 驗(yàn)收代碼寄存器(ACR3)??SJA1000_WRITE(ACR3,0X44); // 驗(yàn)收代碼寄存器(ACR4)? ? SJA1000_WRITE(AMR0,0X11); // 驗(yàn)收屏蔽寄存器??SJA1000_WRITE(AMR1,0X11); // 驗(yàn)收屏蔽寄存器??SJA1000_WRITE(AMR2,0X11); // 驗(yàn)收屏蔽寄存器??SJA1000_WRITE(AMR3,0X11); // 驗(yàn)收屏蔽寄存器? ? do??{? ? SJA1000_WRITE(MODR,0X0C);? ? ? ? TempData = SJA1000_READ(MODR);? ? ? ? DDRC|=BIT(3);? ? ? ? SJA_RST_H; // SJA1000的RST信號(hào)線(低電平有效)? ? delay(100); // 復(fù)位延時(shí),保證可靠復(fù)位??}??while(!(TempData&0x0C));??return 0;}/*************************************************************************功能說明:接收處理程序**************************************************************************/void rxd_deal(void){??if(RXD_flag)??{? ? GICR=0X00;//關(guān)閉INT0、INT1中斷? ? ? ? RXD_flag=0;? ? ? ? Rxd_data=RX_buffer[5];? ? ? ? GICR=0XC0;//使能INT0、INT1??}}/*************************************************************************功能說明:發(fā)送處理程序**************************************************************************/void txd_deal(void){??if(TXD_flag)??{? ? delay_us(10);? ? ? ? TXD_flag=0;? ? ? ? can_txd();? ? ? ? delay_us(10);??}}/*************************************************************************功能說明:發(fā)送擴(kuò)展數(shù)據(jù)幀**************************************************************************/void can_txd(void){??uchar state;??TX_buffer[0]=0X81;??TX_buffer[1]=0X11;??TX_buffer[2]=0X22;??TX_buffer[3]=0X33;??TX_buffer[4]=0X44;??TX_buffer[5]=Txd_data;??TX_buffer[6]=0X22;??TX_buffer[7]=0X33;??TX_buffer[8]=0X44;??TX_buffer[9]=0X55;??TX_buffer[10]=0X66;??TX_buffer[11]=0X77;??TX_buffer[12]=0X88;??GICR=0X00;//關(guān)閉INT0、INT1中斷??do??{? ? state=SJA1000_READ(SR);//讀狀態(tài)寄存器? ? ? ? LED_H;??}??while((state&0x10)==0x10);//判斷是否正在接收,正在接收等待??do??{? ? state=SJA1000_READ(SR);? ? ? ? LED_H;??}??while(!(state&0x08));//發(fā)送請求未處理完等待??do??{? ? state=SJA1000_READ(SR);? ? ? ? LED_H;??}??while(!(state&0x04));??LED_L;??SJA1000_WRITE(TBSR0,TX_buffer[0]);??delay(1);??SJA1000_WRITE(TBSR1,TX_buffer[1]);??delay(1);??SJA1000_WRITE(TBSR2,TX_buffer[2]);??delay(1);??SJA1000_WRITE(TBSR3,TX_buffer[3]);??delay(1);??SJA1000_WRITE(TBSR4,TX_buffer[4]);??delay(1);??SJA1000_WRITE(TBSR5,Txd_data);? ?delay(1);? ?SJA1000_WRITE(TBSR6,TX_buffer[6]);??delay(1);??SJA1000_WRITE(TBSR7,TX_buffer[7]);??delay(1);??SJA1000_WRITE(TBSR8,TX_buffer[8]);??delay(1);??SJA1000_WRITE(TBSR9,TX_buffer[9]);??delay(1);??SJA1000_WRITE(TBSR10,TX_buffer[10]);??delay(1);??SJA1000_WRITE(TBSR11,TX_buffer[11]);??delay(1);??SJA1000_WRITE(TBSR12,TX_buffer[12]);??delay(100);? ?? ?SJA1000_WRITE(CMR,0X10);//自接收請求??delay(100);??GICR=0XC0;//使能INT0、INT1??}/*************************************************************************功能說明:主函數(shù)**************************************************************************/void main(void){??uchar i;??init_mcu();//單片機(jī)自身初始化??delay(100);??init_1602();//顯示初始化??delay(100);??init_SJA1000_HardWare();//SJA1000硬件初始化??delay(100);??do??{? ? TempData = init_SJA1000_Soft(); // SJA1000軟件初始化系統(tǒng)??}??while(TempData!=0);? ? usart_transmit(0x0b);//串口發(fā)送初始化完成標(biāo)志??delay(10);? ? while(1)??{? ? ? ? rxd_deal();? ? ? ? txd_deal();? ? ? ? first(0,num[Txd_data]);//1602第一行第一格顯示要發(fā)送的報(bào)文? ? ? ? second(0,num[Rxd_data]);//1602第二行第一格顯示接收的報(bào)文? ? ? ? if(Txd_data==16)? ? ? ? Txd_data=0;? ? ? ? if(Rxd_data==16)? ? ? ? Rxd_data=0;??}??}
總結(jié)
以上是生活随笔為你收集整理的sja1000 中断_SJA1000PeliCAN模式下自收发问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Photoshop CC 2019安装过
- 下一篇: 具有资源开放性的物联网能力要求