基于P89C668单片机的CAN总线接口设计
时间:07-25
来源:互联网
点击:
2.2 CAN 总线发送程序
对SJA1000控制器进行初始化建立CAN总线通信后,就可以通过CAN总线发送和接收报文.发送程序负责节点的报文发送.发送报文时,用户只需将需要发送的数据按一定的格式组合成一帧的报文,并送入SJA1000发送缓存区中,然后启动SJA1000发送即可.发送程序分发送数据帧和远程帧两种.通过设置RTR以决定是发送数据帧还是远程帧.
SJA1000的报文主要有中断控制和查询两种发送方式.主动发送报文建议采用查询方式,一次发送不成功,可再次发送,这样发送程序的处理比较简单,可采用查询SJA1000控制部分状态标识符的方法.下面给出以查询方式发送报文的发送程序.
CAN_SEND: MOV DPTR, #SR; 状态寄存器SR
MOVX A, @DPTR;
ANL A, #04H
JZ CAN_SEND; 等待发送寄存器释放
MOV R7, #0AH
MOV R0, #TXB_Data; 待发送数据的首地址
MOV DPTR, #TXB_Addr; 发送寄存器的基地址
LOOP1: MOV A, @R0; 将数据写入发送寄存器
MOVX @DPTR, A
INC DPTR
INC R0
DJNZ R7, LOOP1
MOV DPTR, #CMR; 命令寄存器
MO A, #01H; 发送请求命令
MOVX @DPTR, A
RET
2.3 CAN总线接收程序
SJA1000 根据规则自动接收消息,接收到的消息放入接收缓冲器,同时接收缓冲器状态标志位RBS 置为1,接收程序根据RBS 值来决定接收报文与否.SJA1000 报文的接收也有两种方式:中断和查询.对通信的实时性要求不高时,可采用查询方式,否则采用中断方式.以下给出中断接收方式程序.
CAN_INT: CLR EA; 关所有中断
MOV DPTR, #IER; 中断寄存器IER 使能
MOVX A, @DPTR
MOV R6, A; 保存SJA1000 中断允
MOV A, #00H ; 重设SJA1000 中断允许模式为不允许任何中断
MOVX @DPTR, A
LCALL RECEIVE; 接收信息
JZ ReceivOk; 接收到的信息正确则跳转,否则进行错误处理.. ..; 错误处理
ReceivOk: MOV DPTR, #IER
MOV A, R6; 恢复SJA1000 中断允许模式
MOVX @DPTR, A
SETB EA; 开放中断
RETI
RECEIVE: CLR A
MOV DPTR, #SR; 状态寄存器SR
JZ ERROR; 不是正常的消息接收中断则跳转
LOOP2: MOV DPTR, #RXB_Addr; 接收寄存器的基地址
MOV R1, #RXB_Data; 存放所接收数据的首地址
MOV R7, #0AH
LOOP3: MOVX A, @DPTR; 接收数据
MOV @R1, A; 保存数据
INC DPTR
INC R1
DJNZ R7, LOOP3
MOV DPTR, #CMR; 命令寄存器
MOV A, #0X04; 释放接收缓冲器
MOVX @DPTR, A
MOV DPTR, #SR
MOVX A, @DPTR
CJNE A, #01H, LOOP2; 等待接收队列为空
MOVD PTR, #IR; 中断寄存器IR
MOVX A, @DPTR; 清空SJA1000 的接收中断标识位
CLR A; 返回值ACC=0,表示接收消息正确
LJMP END_RECEIVE
ERROR: .. ..; 接收消息错误处理
MOVA, #01H; 返回值ACC=1,表示接收消息不正确
NED_RECEIVE: RET
3 结语
以上介绍了P89C668单片机及其与CAN控制器SJA1000之间的接口方法,并给出了SJA1000在PeliCAN模式下的SJA1000初始化程序、发送程序和接收程序.可在此基础上实现更复杂的CAN总线通信处理,如报警处理、错误处理等.
对SJA1000控制器进行初始化建立CAN总线通信后,就可以通过CAN总线发送和接收报文.发送程序负责节点的报文发送.发送报文时,用户只需将需要发送的数据按一定的格式组合成一帧的报文,并送入SJA1000发送缓存区中,然后启动SJA1000发送即可.发送程序分发送数据帧和远程帧两种.通过设置RTR以决定是发送数据帧还是远程帧.
SJA1000的报文主要有中断控制和查询两种发送方式.主动发送报文建议采用查询方式,一次发送不成功,可再次发送,这样发送程序的处理比较简单,可采用查询SJA1000控制部分状态标识符的方法.下面给出以查询方式发送报文的发送程序.
CAN_SEND: MOV DPTR, #SR; 状态寄存器SR
MOVX A, @DPTR;
ANL A, #04H
JZ CAN_SEND; 等待发送寄存器释放
MOV R7, #0AH
MOV R0, #TXB_Data; 待发送数据的首地址
MOV DPTR, #TXB_Addr; 发送寄存器的基地址
LOOP1: MOV A, @R0; 将数据写入发送寄存器
MOVX @DPTR, A
INC DPTR
INC R0
DJNZ R7, LOOP1
MOV DPTR, #CMR; 命令寄存器
MO A, #01H; 发送请求命令
MOVX @DPTR, A
RET
2.3 CAN总线接收程序
SJA1000 根据规则自动接收消息,接收到的消息放入接收缓冲器,同时接收缓冲器状态标志位RBS 置为1,接收程序根据RBS 值来决定接收报文与否.SJA1000 报文的接收也有两种方式:中断和查询.对通信的实时性要求不高时,可采用查询方式,否则采用中断方式.以下给出中断接收方式程序.
CAN_INT: CLR EA; 关所有中断
MOV DPTR, #IER; 中断寄存器IER 使能
MOVX A, @DPTR
MOV R6, A; 保存SJA1000 中断允
MOV A, #00H ; 重设SJA1000 中断允许模式为不允许任何中断
MOVX @DPTR, A
LCALL RECEIVE; 接收信息
JZ ReceivOk; 接收到的信息正确则跳转,否则进行错误处理.. ..; 错误处理
ReceivOk: MOV DPTR, #IER
MOV A, R6; 恢复SJA1000 中断允许模式
MOVX @DPTR, A
SETB EA; 开放中断
RETI
RECEIVE: CLR A
MOV DPTR, #SR; 状态寄存器SR
JZ ERROR; 不是正常的消息接收中断则跳转
LOOP2: MOV DPTR, #RXB_Addr; 接收寄存器的基地址
MOV R1, #RXB_Data; 存放所接收数据的首地址
MOV R7, #0AH
LOOP3: MOVX A, @DPTR; 接收数据
MOV @R1, A; 保存数据
INC DPTR
INC R1
DJNZ R7, LOOP3
MOV DPTR, #CMR; 命令寄存器
MOV A, #0X04; 释放接收缓冲器
MOVX @DPTR, A
MOV DPTR, #SR
MOVX A, @DPTR
CJNE A, #01H, LOOP2; 等待接收队列为空
MOVD PTR, #IR; 中断寄存器IR
MOVX A, @DPTR; 清空SJA1000 的接收中断标识位
CLR A; 返回值ACC=0,表示接收消息正确
LJMP END_RECEIVE
ERROR: .. ..; 接收消息错误处理
MOVA, #01H; 返回值ACC=1,表示接收消息不正确
NED_RECEIVE: RET
3 结语
以上介绍了P89C668单片机及其与CAN控制器SJA1000之间的接口方法,并给出了SJA1000在PeliCAN模式下的SJA1000初始化程序、发送程序和接收程序.可在此基础上实现更复杂的CAN总线通信处理,如报警处理、错误处理等.
总线 CAN总线 电路 单片机 收发器 CMOS 51单片机 振荡器 PWM 比较器 相关文章:
- 热插拔和缓冲I2C总线 (04-14)
- PCIe总线何时突破Unix服务器坚冰(02-03)
- TMS320VC5402 HPI接口与PCI总线接口设计(04-12)
- 基于Nios II的I2C总线接口的实现(04-09)
- 双口RAM CY7C026在高速数据采集系统中的应用(04-12)
- 计算机在新型多电机同步系统中的应用(07-08)