假设采用MCS-51单片机与独立 CAN 控制器 SJA1000设计CAN总线应用节点 SJA1000对应的端口地址为8000H,若采用查询方式处理接收数据,ACR=01H,AMR=00H BTR0=01H, BTR1=1CH, OCR=1AH,请写出CAN总线节点初始化子程序。
时间: 2024-10-06 21:04:35 浏览: 38
单片机与DSP中的SJA1000控制器在多电机综合保护器中的应用
在使用MCS-51单片机与SJA1000独立CAN控制器设计CAN总线应用节点时,初始化子程序主要包括设置硬件寄存器和配置通信参数。以下是基于提供的条件的初始化步骤:
```c
__attribute__((interrupt(" vect"))) void CAN_Init(void) {
// 设置波特率匹配值 (Baud Rate Prescaler)
TMOD = 0x02; // 使用模式2,T1作为波特率发生器
TH1 = ((256 - (BTR1 & 0x1F) * 12) / Fosc) >> 1; // Fosc通常为12MHz
TL1 = (TH1 << 8);
// 初始化CAN控制器
TR0 = 0; // 禁止定时器T0
SCON = 0x00; // 清除SM0和SM1,禁止串行通讯
P2 = 0x80; // 设置CAN控制器地址,映射到P2.7,即8000H
// 初始化接收部分
SJA1000_InitStructure.ACR = 0x01; // ACR=01H 表示标准帧,自动应答请求
SJA1000_InitStructure.AMR = 0x00; // AMR=00H 表示无错误检测模式
SJA1000_InitStructure.BTR0 = 0x01; // BTR0=01H,启动接收环路
SJA1000_InitStructure.BTR1 = 0x1C; // BTR1=1CH,选择波特率为500kbps
// OCR设置接收时间间隔,这里假设OCR=1AH对应一个9.2us的接收窗口
SJA1000_InitStructure.OCR = 0x1A;
// 开启CAN控制器
SJA1000_Cmd(CAN_CMD_ENABLE); // 启动接收过程
// 结束中断
__中断_disable__;
}
```
注意:这里的代码片段是一个简化版本,实际应用中还需要连接相应的中断服务程序(ISRs),以及处理错误标志、接收缓冲区等细节。另外,"SJA1000_Cmd"和"SJA1000_InitStructure"是假设的函数和结构体,你需要查看具体的SJA1000手册来进行相应的API调用。
阅读全文