DSP28035 CAN控制器收发例程 - 详细代码示例
以下是DSP28035芯片CAN控制器的收发例程:
收CAN信息:
#include "DSP2803x_Device.h"
#include "DSP2803x_Examples.h"
void InitCAN(void);
void InitCANMsg(void);
void CANSend(uint16_t data[], uint16_t msgBoxNum);
void CANReceive(uint16_t msgBoxNum);
void main(void)
{
InitSysCtrl();
InitPieCtrl();
InitCAN();
InitCANMsg();
while(1)
{
CANReceive(1); // 接收CAN信息
}
}
void InitCAN()
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.ECANAENCLK = 1; // 使能CAN模块时钟
EDIS;
InitECana(); // 初始化ECAN模块
}
void InitCANMsg()
{
ECanaShadow.CANME.all = ECanaRegs.CANME.all; // 将CANME寄存器的值保存到CAN模块阴影寄存器中
// 配置接收邮箱
ECanaMboxes.MBOX1.MSGID.all = 0x20000000; // 消息ID
ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8; // 数据长度
ECanaMboxes.MBOX1.MSGCTRL.bit.RTR = 0; // 非远程帧
ECanaShadow.CANME.bit.ME1 = 1; // 使能邮箱1接收
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
// 配置发送邮箱
ECanaMboxes.MBOX2.MSGID.all = 0x10000000; // 消息ID
ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = 8; // 数据长度
ECanaMboxes.MBOX2.MSGCTRL.bit.RTR = 0; // 非远程帧
ECanaShadow.CANME.bit.ME2 = 1; // 使能邮箱2发送
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
// 配置邮箱位掩码
ECanaRegs.CANMIM.all = 0xFFFFFFFF; // 接收所有消息
}
void CANSend(uint16_t data[], uint16_t msgBoxNum)
{
int i;
// 将数据写入邮箱
for(i = 0; i < 8; i++)
{
ECanaMboxes[msgBoxNum].MDATA.all = data[i];
}
// 发送数据
ECanaMboxes[msgBoxNum].MSGCTRL.bit.TXEN = 1; // 使能发送
ECanaMboxes[msgBoxNum].MSGCTRL.bit.TXRQST = 1; // 发送请求
}
void CANReceive(uint16_t msgBoxNum)
{
// 检查邮箱是否有新数据
if(ECanaRegs.CANRMP.all & (1 << msgBoxNum))
{
uint16_t data[8];
int i;
// 读取数据
for(i = 0; i < 8; i++)
{
data[i] = ECanaMboxes[msgBoxNum].MDATA.all;
}
// 处理数据
// ...
// 清除新数据标志位
ECanaRegs.CANRMP.all = 1 << msgBoxNum;
}
}
发CAN信息:
#include "DSP2803x_Device.h"
#include "DSP2803x_Examples.h"
void InitCAN(void);
void InitCANMsg(void);
void CANSend(uint16_t data[], uint16_t msgBoxNum);
void CANReceive(uint16_t msgBoxNum);
void main(void)
{
InitSysCtrl();
InitPieCtrl();
InitCAN();
InitCANMsg();
while(1)
{
uint16_t data[8] = {1, 2, 3, 4, 5, 6, 7, 8};
CANSend(data, 2); // 发送CAN信息
}
}
void InitCAN()
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.ECANAENCLK = 1; // 使能CAN模块时钟
EDIS;
InitECana(); // 初始化ECAN模块
}
void InitCANMsg()
{
ECanaShadow.CANME.all = ECanaRegs.CANME.all; // 将CANME寄存器的值保存到CAN模块阴影寄存器中
// 配置接收邮箱
ECanaMboxes.MBOX1.MSGID.all = 0x20000000; // 消息ID
ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8; // 数据长度
ECanaMboxes.MBOX1.MSGCTRL.bit.RTR = 0; // 非远程帧
ECanaShadow.CANME.bit.ME1 = 1; // 使能邮箱1接收
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
// 配置发送邮箱
ECanaMboxes.MBOX2.MSGID.all = 0x10000000; // 消息ID
ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = 8; // 数据长度
ECanaMboxes.MBOX2.MSGCTRL.bit.RTR = 0; // 非远程帧
ECanaShadow.CANME.bit.ME2 = 1; // 使能邮箱2发送
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
// 配置邮箱位掩码
ECanaRegs.CANMIM.all = 0xFFFFFFFF; // 接收所有消息
}
void CANSend(uint16_t data[], uint16_t msgBoxNum)
{
int i;
// 将数据写入邮箱
for(i = 0; i < 8; i++)
{
ECanaMboxes[msgBoxNum].MDATA.all = data[i];
}
// 发送数据
ECanaMboxes[msgBoxNum].MSGCTRL.bit.TXEN = 1; // 使能发送
ECanaMboxes[msgBoxNum].MSGCTRL.bit.TXRQST = 1; // 发送请求
}
void CANReceive(uint16_t msgBoxNum)
{
// 检查邮箱是否有新数据
if(ECanaRegs.CANRMP.all & (1 << msgBoxNum))
{
uint16_t data[8];
int i;
// 读取数据
for(i = 0; i < 8; i++)
{
data[i] = ECanaMboxes[msgBoxNum].MDATA.all;
}
// 处理数据
// ...
// 清除新数据标志位
ECanaRegs.CANRMP.all = 1 << msgBoxNum;
}
}
原文地址: https://www.cveoy.top/t/topic/nq7r 著作权归作者所有。请勿转载和采集!