1.准备:
DSP28346板子(DSP28335很相似,基本一样)、USB-CAN分析仪(只要能USB转CAN就可以,电子发烧友淘宝店有那种六合一的就可以,9.9包邮好像)、杜邦线;
2.搭建:
用杜邦线按下图所示连接USB-CAN和DSP28346板子,通过USB线连接PC和USB-CAN分析仪;
需要注意的是:USB-CAN需要与DSP板的数字地GND共地,直接短接即可]
3.代码实现
思路:1)配置GPIO、2)初始化eCAN模块,选择相应的模式,配置波特率、3)邮箱配置:我是用eCANb,邮箱15接收任何id的报文,邮箱16发送任何id的报文、4)写发送、接收函数
// TI File $Revision: /main/6 $
// Checkin $Date: August 19, 2008 14:09:24 $
//###########################################################################
//
// FILE: DSP2834x_ECan.c
//
// TITLE: DSP2834x Enhanced CAN Initialization & Support Functions.
//
//###########################################################################
// $TI Release: 2834x Header Files V1.12 $
// $Release Date: March 2011 $
//###########################################################################
#include "DSP2834x_Device.h" // DSP28 Headerfile Include File
#include "DSP2834x_Examples.h" // DSP28 Examples Include File
#include "DSP28x_Project.h"
struct ECAN_REGS ECanaShadow;
struct ECAN_REGS ECanbShadow;
Uint32 ecan_data_h;//获取接收报文的数据,用于CANOpen解析
Uint32 ecan_data_l;
//步骤一:ECana和ECanb模块的GPIO初始化设置
//********************************************************
//函数名称:InitECanbGpio()
//函数功能:初始化ECanb模块的GPIO引脚,要根据硬件来设置
//********************************************************
void InitECanbGpio(void)
{
EALLOW;
// GpioCtrlRegs.GPAPUD.bit.GPIO8 = 1; // Disable pull-up for GPIO8 (CANTXB)
// GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1; // Disable pull-up for GPIO12 (CANTXB)
// GpioCtrlRegs.GPAPUD.bit.GPIO16 = 1; // Disable pull-up for GPIO16 (CANTXB)
GpioCtrlRegs.GPAPUD.bit.GPIO20 = 1; // Disable pull-up for GPIO20 (CANTXB)
// GpioCtrlRegs.GPAPUD.bit.GPIO10 = 0; // Enable pull-up for GPIO10 (CANRXB)
// GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0; // Enable pull-up for GPIO13 (CANRXB)
// GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up for GPIO17 (CANRXB)
GpioCtrlRegs.GPAPUD.bit.GPIO21 = 0; // Enable pull-up for GPIO21 (CANRXB)
/* Set qualification for selected CAN pins to asynch only */
// Inputs are synchronized to SYSCLKOUT by default.
// This will select asynch (no qualification) for the selected pins.
// Comment out other unwanted lines.
// GpioCtrlRegs.GPAQSEL1.bit.GPIO10 = 3; // Asynch qual for GPIO10 (CANRXB)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 3; // Asynch qual for GPIO13 (CANRXB)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch qual for GPIO17 (CANRXB)
GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 3; // Asynch qual for GPIO21 (CANRXB)
/* Configure eCAN-B pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be eCAN functional pins.
// GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 2; // Configure GPIO8 for CANTXB operation
// GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 2; // Configure GPIO12 for CANTXB operation
// GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 2; // Configure GPIO16 for CANTXB operation
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 3; // Configure GPIO20 for CANTXB operation
// GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 2; // Configure GPIO10 for CANRXB operation
// GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 2; // Configure GPIO13 for CANRXB operation
// GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 2; // Configure GPIO17 for CANRXB operation
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 3; // Configure GPIO21 for CANRXB operation
EDIS;
}
//步骤二:初始化eCANb模块
//***********************************************
//函数名称:InitECANb
//函数功能:初始化ECanb模块:波特率
//注意事项:ECanb模块初始化并没有配置邮箱方向和MSGID
//Author:Liuxiang 20191008
//***********************************************
void InitECANb()
{
struct ECAN_REGS ECanbShadow;
EALLOW;
//CANTX和CANRX引脚设定
ECanbShadow.CANTIOC.all = ECanbRegs.CANTIOC.all;
ECanbShadow.CANTIOC.bit.TXFUNC = 1;
ECanbRegs.CANTIOC.all = ECanbShadow.CANTIOC.all;
ECanbShadow.CANRIOC.all = ECanbRegs.CANRIOC.all;
ECanbShadow.CANRIOC.bit.RXFUNC = 1;
ECanbRegs.CANRIOC.all = ECanbShadow.CANRIOC.all;
ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
ECanbShadow.CANMC.bit.SCB = 1; //选择为eCAN模式
ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
//初始化消息控制寄存器
ECanbMboxes.MBOX0.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX1.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX2.MSGCTRL.all