以下是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;
    }
}
DSP28035 CAN控制器收发例程 - 详细代码示例

原文地址: https://www.cveoy.top/t/topic/nq7r 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录