基于C8051F040单片机的CAN总线通信 硬件部分
硬件部分电路结构如下:
CAN收发模块原本采用的是ATA6660高速CAN收发芯片,电路连接如下:
设计电路为:当单片机发送数据时,D18闪烁,并将数据传送给ATA6660芯片;当ATA6660芯片接受到总线上的数据时,D17闪烁,并将数据传送给单片机。
实际调试时,发现C8051F040单片机既没办法发送数据到总线上,也没办法从总线上接收到数据。
用示波器对电路检测发现,当单片机需要发送数据时,ATA6660芯片的TXD引脚上能检测到数据,且D18闪烁。示波器检测总线上的电压,没有变化。PC端显示总线上的数据为FE。当PC端给总线发送数据时,总线上能检测到电压的变化,而ATA6660芯片的RXD引脚电压为0。故怀疑为CAN收发部分硬件存在问题。
因此,将CAN收发模块换为直接购买的TJA1050CAN收发模块,电路如下图所示。通过测试,CAN模块工作正常。而单片机能够成功发送数据,接收数据失败。
对比前后两个电路可以发现,区别在于CAN收发芯片的RS引脚。ATA6660芯片的RS引脚悬空,而TJA1050芯片的RS引脚接地。
查阅ATA6660芯片数据手册,发现RS引脚的功能为Switch Standby Mode/Normal Mode。而Standy Mode的解释为:
故使用ATA6660模块时无法正常收发数据。而正确的电路应为:
软件部分
程序参考自童长飞编著的《C8051F系列单片机开发与C语言编程》例程12-1。
1.基本设置
int n; //看门狗禁止 WDTCN = 0x07; WDTCN = 0xDE; WDTCN = 0xAD; SFRPAGE = 0x0F; //交叉开关使能,但没有进行外围设备配置 XBR0 = 0x00; XBR1 = 0x00; XBR2 = 0x40; XBR3 = 0x00; //管脚输出配置,P0口为开漏输出,其中P0.6接上拉电阻,P0为数字输入口 SFRPAGE = 0x0F; P0MDOUT = 0x00; P1MDIN = 0xFF; //晶振配置 OSCXCN = 0x77;//选择外部晶振22.1MHz。 //系统时钟为外部时钟二分频:22.1 MHz / 2 = 11.05 MHz for (n = 0; n < 255; n++); while ((OSCXCN & 0x80) == 0); CLKSEL |= 0x01;2.CAN消息对象清零
void clear_msg_objects (void) //将所有消息清零 { uchar i; SFRPAGE = CAN0_PAGE; CAN0ADR = IF1CMDMSK; CAN0DATL = 0xFF; for (i=1;i<33;i++) { CAN0ADR = IF1CMDRQST; CAN0DATL = i; } }3.CAN发送初始化
void init_msg_object_TX (char MsgNum,uint id) { uint temp; SFRPAGE = CAN0_PAGE; CAN0ADR = IF1CMDMSK; //指向IF1 Command Mask Registers CAN0DAT = 0x00b3; /* IF1 Command Mask Registers =0x00b3 WR/RD=1,Mask=0,Arb=1,Control=1,ClrIntPnd=0,TxRqst=0,DataA=1,DataB=1,一次发送8字节数据*/ CAN0ADR = IF1ARB1; CAN0DAT = 0x0000; /*IF1 ArbitraTIon Registers1 =0x0000,即ID15-0=0*/ temp=id<<2;//标准id为ID28-ID18,所以要左移2位 temp&=0x1fff; temp|=0xa000; CAN0DAT = temp; //地址自增,指向IF1 ArbitraTIon Registers2 /*IF1 ArbitraTIon Registers2=101(id)00b MsgVal=1,Xtd=0,为标准模式,扩展ID无效,Dir=1,为发送*/ CAN0DAT = 0x0088; /*IF1 Message Control Registers=0x0088 NewDat=0,MsgLst=0,IntPnd=0,UMask=0,TxIE=0,RxIE=0,RmtEn=0,TxRqst=0 EoB=1,DLC3-0=1000,即数据长度为8*/ CAN0ADR = IF1CMDRQST; CAN0DAT = MsgNum; /*IF1 Command Request Registers=MsgNum,将以上配置写入MsgNum号消息*/ }欢迎分享,转载请注明来源:内存溢出
评论列表(0条)