完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
sja1000的数据/地址口跟 128的 AD0-AD7相连,sja的片选端为128的PC7(A15),sja复位为PC6,sja 的 ALE RD WR分别与12的 ALE RD WR相连,sja的INT与128的iINT5相连。我用CAN--UART与此CAN节点相连,想要在PC上通过串口调试助手看收到的数据,可什么都没有,请大家帮我看看。程序如下。
//---------------------------------------------------------- //功能描述:配合SIM900A 发送一条英文短信 永远在线 自动重拨、 //---------------------------------------------------------- //头函数 #include #include #include #include #include #define ***i(sfr,bit) (_SFR_BYTE(sfr)|=_BV(bit)) #define cbi(sfr,bit) (_SFR_BYTE(sfr)&=~_BV(bit)) #define SJA_REG_BaseADD 0x7f00 #define MODE (*(volatile uint16_t *)0x7F00) #define CMR (*(volatile uint16_t *)0x7F01) #define SR (*(volatile uint16_t *)0x7F02) #define IR (*(volatile uint16_t *)0x7F03) #define IER (*(volatile uint16_t *)0x7F04) #define BTR0 (*(volatile uint16_t *)0x7F06) //05保留 #define BTR1 (*(volatile uint16_t *)0x7F07) #define OCR (*(volatile uint16_t *)0x7F08) #define TEST (*(volatile uint16_t *)0x7F09) #define ALC (*(volatile uint16_t *)0x7F0B) //0a保留 #define ECC (*(volatile uint16_t *)0x7F0C) #define EMLR (*(volatile uint16_t *)0x7F0D) #define RXERR (*(volatile uint16_t *)0x7F0E) #define TXERR (*(volatile uint16_t *)0x7F0F) #define ACR0 (*(volatile uint16_t *)0x7F10) #define ACR1 (*(volatile uint16_t *)0x7F11) #define ACR2 (*(volatile uint16_t *)0x7F12) #define ACR3 (*(volatile uint16_t *)0x7F13) #define AMR0 (*(volatile uint16_t *)0x7F14) #define AMR1 (*(volatile uint16_t *)0x7F15) #define AMR2 (*(volatile uint16_t *)0x7F16) #define AMR3 (*(volatile uint16_t *)0x7F17) #define RxBuffer0 (*(volatile uint16_t *)0x7F10) #define RxBuffer1 (*(volatile uint16_t *)0x7F11) #define RxBuffer2 (*(volatile uint16_t *)0x7F12) #define RxBuffer3 (*(volatile uint16_t *)0x7F13) #define RxBuffer4 (*(volatile uint16_t *)0x7F14) #define TxBuffer0 (*(volatile uint16_t *)0x7F10) #define TxBuffer1 (*(volatile uint16_t *)0x7F11) #define TxBuffer2 (*(volatile uint16_t *)0x7F12) #define TxBuffer3 (*(volatile uint16_t *)0x7F13) #define TxBuffer4 (*(volatile uint16_t *)0x7F14) #define DataBuffer1 (*(volatile uint16_t *)0x7F15) #define DataBuffer2 (*(volatile uint16_t *)0x7F16) #define DataBuffer3 (*(volatile uint16_t *)0x7F17) #define DataBuffer4 (*(volatile uint16_t *)0x7F18) #define DataBuffer5 (*(volatile uint16_t *)0x7F19) #define DataBuffer6 (*(volatile uint16_t *)0x7F1A) #define DataBuffer7 (*(volatile uint16_t *)0x7F1B) #define DataBuffer8 (*(volatile uint16_t *)0x7F1C) #define RBSA (*(volatile uint16_t *)0x7F1E) #define CDR (*(volatile uint16_t *)0x7F1F) #define Receive_Counter (*(volatile uint16_t *)0x7F1D) //---------------------------------------------------------- //变量定义区 uint8_t temp0_data[200];//存放中间变量 uint8_t rec0_num; uint8_t time0_num; uint8_t TX_buffer[13]; uint8_t RX_buffer[13]; uint8_t RXD_flag; //---------------------------------------------------------- //延时程序 void delay_ms(uint8_t xtal) { uint8_t i; for(i=1;i<(uint8_t)(xtal*143-2);i++) {;} } //延时1s void delay_s(void) { time0_num=0; while(!(time0_num>=50)) ; //时间可在此处修改 50对应1s return 1; } //---------------------------------------------------------- //---------------------------------------------------------- //---------------------------------------------------------- //初始化TIME0 void init_time0(void) { TCNT0=0X70; TCCR0=0X07; TIMSK=0X01; //sei(); } //---------------------------------------------------------- //TIM0溢出中断服务程序 SIGNAL(SIG_OVERFLOW0) { time0_num++; TCNT0=0X70; } //---------------------------------------------------------- //------------------------------------------------------- //------------------------------------------------------- //串口0初始化 void UART0_SETTING(int baud_rate, long fosc) { UBRR0L=(fosc/16/(baud_rate+1))%256; UBRR0H=(fosc/16/(baud_rate+1))/256; UCSR0B|=(1< //---------------------------------------------------------- //串口0发送单字节 void UART0_DATA_BYTE_SEND(uint8_t data) { if(!(UCSR0A&(1< UCSR0A|=(1< while(!(UCSR0A&(1< UDR0=data;//发送数据 loop_until_bit_is_set(UCSR0A,TXC0);//查询发送是否结束 UCSR0A=UCSR0A|(1< } //---------------------------------------------------------- //串口0接收中断服务程序 SIGNAL(SIG_UART0_RECV) { uint8_t data; loop_until_bit_is_set(UCSR0A,RXC0); data=UDR0; UCSR0A|=1< temp0_data[rec0_num]=data;//保存接收数据 rec0_num++; if(rec0_num>=200) rec0_num=0; } //---------------------------------------------------------- //串口0发送数据包服务程序 void send0_data(uint8_t lengh,uint8_t *ptr) { uint8_t i; i=0; while(i UART0_DATA_BYTE_SEND(*(ptr++)); i++; }; } //---------------------------------------------------------- //---------------------------------------------------------- //SJA1000初始化 void init_can(void) { uint8_t state; send0_data(strlen("enter init can"),"enter init can"); send0_data(strlen("rn"),"rn"); uint8_t ACRR[4]={0XAA,0XFF,0X22,0X11};// 接收代码寄存器 uint8_t AMRR[4]={0xff,0xff,0xff,0xff};// 接收屏蔽寄存器 //uint8_t AMRR[4]={0x00,0x00,0xff,0xff};// 接收屏蔽寄存器 do// 使用do--while语句确保进入复位模式 { MODE=0x09; // 设置MOD.0=1--进入复位模式,以便设置相应的寄存器 state = MODE; UART0_DATA_BYTE_SEND(MODE+'0'); send0_data(strlen("rn"),"rn"); delay_s(); send0_data(strlen("enter init can"),"enter init can"); send0_data(strlen("rn"),"rn"); //delay_ms(200); } while( !(state & 0x01) ); UART0_DATA_BYTE_SEND(state+'0'); send0_data(strlen("rn"),"rn"); send0_data(strlen("enter rst-soft can"),"enter rst_soft can"); send0_data(strlen("rn"),"rn"); // 对SJA1000部分寄存器进行初始化设置 CDR = 0x88; // CDR为时钟分频器,CDR.3=1--时钟关闭, CDR.7=0---basic CAN, CDR.7=1---Peli CAN UART0_DATA_BYTE_SEND(CDR+'0'); send0_data(strlen("rn"),"rn"); BTR0 = 0x04;//0x31; // 总线定时寄存器0 ;总线波特率设定 UART0_DATA_BYTE_SEND(BTR0+'0'); send0_data(strlen("rn"),"rn"); BTR1 = 0x1c;//0x1c; // 总线定时寄存器1 ;总线波特率设定 UART0_DATA_BYTE_SEND(BTR1+'0'); send0_data(strlen("rn"),"rn"); IER = 0x01; // IER.0=1--接收中断使能; IER.1=0--关闭发送中断使能 OCR = 0xaa; // 配置输出控制寄存器 CMR = 0x04; // 释放接收缓冲器 ACR0 = ACRR[0];// 初始化接收代码寄存器 ACR1 = ACRR[1]; ACR2 = ACRR[2]; ACR3 = ACRR[3]; AMR0 = AMRR[0];// 初始化接收屏蔽寄存器 AMR1 = AMRR[1]; AMR2 = AMRR[2]; AMR3 = AMRR[3]; send0_data(strlen("ACR AMR OK"),"ACR AMROK"); send0_data(strlen("rn"),"rn"); do// 使用do--while语句确保退出复位模式 { MODE = 0x08; //MOD.3=0--双滤波器模式 state = MODE; delay_s(); UART0_DATA_BYTE_SEND(MODE+'0'); send0_data(strlen("rn"),"rn"); send0_data(strlen("exiting"),"exiting"); send0_data(strlen("rn"),"rn"); } while( state & 0x01 ); send0_data(strlen("init CAN ok"),"init CAN ok"); send0_data(strlen("rn"),"rn"); } //---------------------------------------------------------- //---------------------------------------------------------- //CAN发送数据到CAN-Bus void can_txd(void) { uint8_t state; send0_data(strlen("enter can_txd"),"enter can-txd"); send0_data(strlen("rn"),"rn"); //初始化标示码头信息 TX_buffer[0] = 0x88; //.7=0--扩展帧;.6=0--数据帧; .0-.3=100--数据长度为8字节 TX_buffer[1] = 0xFF; //本帧信息的ID TX_buffer[2] = 0xFF; TX_buffer[3] = 0xFF; TX_buffer[4] = 0xFF; TX_buffer[5]=0x01; TX_buffer[6]=0x02; TX_buffer[7]=0x03; TX_buffer[8]=0x04; TX_buffer[9]=0x05; TX_buffer[10]=0x06; TX_buffer[11]=0x07; TX_buffer[12]=0xaa; send0_data(strlen("TX buffer ok"),"TX buffer ok"); send0_data(strlen("rn"),"rn"); do //查询SJA1000是否处于接收状态,当SJA1000不处于接收状态时才可继续执行 { state=SR; //SR为SJA1000的状态寄存器 } while( state & 0x10 ); //SR.4=1 正在接收,等待 send0_data(strlen("bu jieshou"),"bu jieshou"); send0_data(strlen("rn"),"rn"); do //查询SJA1000是否处于发送完毕状态 { state=SR; } while(!(state & 0x08)); //SR.3=0,发送请求未处理完,等待直到SR.3=1 send0_data(strlen("fasong qing qiu chuli wan"),"fasong qing qiu chuli wan"); send0_data(strlen("rn"),"rn"); do //查询发送缓冲器状态 { state=SR; } while(!(state & 0x04)); //SR.2=0,发送缓冲器被锁。等待直到SR.2=1 send0_data(strlen("huanchongqi ok"),"huanchongqi ok"); send0_data(strlen("rn"),"rn"); //将待发送的一帧数据信息存入SJA1000的相应寄存器中 TxBuffer0 = TX_buffer[0]; TxBuffer1 = TX_buffer[1]; TxBuffer2 = TX_buffer[2]; TxBuffer3 = TX_buffer[3]; TxBuffer4 = TX_buffer[4]; DataBuffer1 =TX_buffer[5]; DataBuffer2 = TX_buffer[6]; DataBuffer3 = TX_buffer[7]; DataBuffer4 = TX_buffer[8]; DataBuffer5 = TX_buffer[9]; DataBuffer6 = TX_buffer[10]; DataBuffer7 = TX_buffer[11]; DataBuffer8 = TX_buffer[12]; CMR = 0x04; //置位发送请求 while(!(SR&0X08));//检测SR.3位,判断发送是否完成 } //---------------------------------------------------------- //中断接收来自CAN-Bus数据 SIGNAL(SIG_INTERRUPT5) { uint8_t state; cli(); //关CPU中断 //IE0 = 0; //由于是中断INT1是电平触发方式,所以需要软件将INT1的中断请求标志IE0清零 state = IR; //IR为SJA1000的中断寄存器 if( state & 0x01) //若IR.0=1--接收中断 { RX_buffer[0] = RxBuffer0; RX_buffer[1] = RxBuffer1; RX_buffer[2] = RxBuffer2; RX_buffer[3] = RxBuffer3; RX_buffer[4] = RxBuffer4; RX_buffer[5] = DataBuffer1; RX_buffer[6] = DataBuffer2; RX_buffer[7] = DataBuffer3; RX_buffer[8] = DataBuffer4; RX_buffer[9] = DataBuffer5; RX_buffer[10] = DataBuffer6; RX_buffer[11] = DataBuffer7; RX_buffer[12] = DataBuffer8; RXD_flag = 1; //接收标志置位,以便进入接收处理程序 CMR = 0x04; //CMR.2=1--接收完毕,释放接收缓冲器 state = ALC; //释放仲裁随时捕捉寄存器(读该寄存器即可) state = ECC; //释放错误代码捕捉寄存器(读该寄存器即可) } EIFR|=0X01; // IER.0=1--接收中断使能 sei(); //重新开启CPU中断 } //---------------------------------------------------------- //---------------------------------------------------------- void init_int0(void) { EIMSK=0x20; EICRA=0X00; sei(); } //---------------------------------------------------------- //can-rst void can_rst(void) { cbi(PORTF,PF3);// 复位 delay_s(); delay_s(); ***i(PORTF,PF3); delay_s(); send0_data(strlen("can_rst ok"),"can_rst ok"); delay_s(); } //---------------------------------------------------------- //---------------------------------------------------------- //主程序 int main(void) { uint8_t i; cli(); //关中断 UART0_SETTING(9600,7372800);//设置波特率、允许发送和接收,8位数据+1位STOP位 init_time0(); MCUCR |= 0x80; //允许外部并行扩展接口, XDIV = 0x00; //xtal divider XMCRA = 0x00; //external memory XMCRB=0x00; EICRA=0x00; ***i(DDRF,PF3);//OUTPUT //***i(DDRC,PC6);//OUTPUT ***i(DDRC,PC7);//选中 cbi(PORTC,PC7);//选中 sei(); can_rst(); init_can(); //sei(); delay_s(); send0_data(strlen("init can ok"),"init can ok"); //delay_s(); send0_data(strlen("rn"),"rn"); delay_ms(200); for(i=0;i<5;i++) { send0_data(strlen("hello"),"hello"); delay_s(); send0_data(strlen("rn"),"rn"); can_txd(); //发送 send0_data(strlen("sending"),"sending"); delay_s(); } } |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
5172 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
7792 浏览 0 评论
3071 浏览 2 评论
3124 浏览 1 评论
10104 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 15:45 , Processed in 0.385860 second(s), Total 43, Slave 33 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191