主题中讨论的其他器件:controlSUITE、 HALCOGEN、 SN65HVD234、 ISO1050
您好!
我使用的是 LAUNCHXL28069M 套件以及开发板、其中包含 用于 CANBus 通信的 TMS570LS4x 微控制器。
LAUNCHXL28069M 用作接收器端、TMS570LS4x 用作发送器端 CAN。
对于 LAUNCHXL28069M 接收器端、我将引用 C:\ti\controlSUITE_3.4.5\device_support\f2806x\v151\F2806x_examples_ccsv5\eCAN-back2back 示例代码
对于 TMS570LS4x Tx CAN 端 C:\ti\Hercules \HALCoGen\v04.06.01\examples\TMS570LS04x_03x_02x/example_CAN_communication。 我已经使用 HALCogen 工具创建了 caninit 函数。
在这种配置之后,每次接收到的数据不是实际传输的数据时,我都不会在 Rx CAN 端接收到有效数据 。 如果我的 CAN 总线初始化错误、请建议我使用 function.below、它是我的 Tx 和 Rx 端代码。
是否有任何令人不安的问题? 或信号 CANH 和 CANL、因为在 LAUNCHXL28069M sn65hvd234 CAN 收发器 IC 上使用的是次级侧没有5伏 Vcc 的 CAN 收发器、在我的开发板上使用的是5 伏 Vcc2的 ISO1050 CAN 收发器。
>>>>>>>>>>> CAN RX 代码>>>>>>>>>>>>>>>>
LAUNCHXL28069M 接收器端 CAN 代码
InitECANa();//CAN 从初始化函数
EALLOW;
ECANaMboxs.MBOX16.MSGID.ALL = 0x00000001;
EDIS;
ECANaRegs.CANMD.ALL = 0xFFFFFF0000;
ECANaRegs.CANME.ALL = 0xFFFFFFFF;
EALLOW;
ECANaRegs.CANMIM.ALL = 0xFFFFFFFF;
EDIS;
EALLOW;
ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECANaShady.CANMC.bit.STM = 0; //将 CAN 配置为自检模式 1.
ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
EDIS;
for (;;)
{ for (j=16;j<32;j++) //读取并检查16个邮箱
{
mailbox_read (j); //此 func 读取指定的邮箱数据
Mailbox_check (TestMbox1、TestMbox2、TestMbox3);//检查接收到的数据
//mailbox_read (16);
}
}主函数结束************
void InitECana (void) //初始化 eCAN-A 模块
{
struct eCAN-regs ECanaShadow;
EALLOW; // asm (" asm (" EALLOW")")启用对受保护位的访问
/*使用 eCAN 寄存器为 CAN 操作配置 eCAN RX 和 TX 引脚*/
ECanaShady.CANTIOC.ALL = ECanaRegs.CANTIOC.ALL;
ECanaShady.CANTIOC.bit.TXFUNC = 1;
ECANaRegs.CANTIOC.ALL = ECANaShady.CANTIOC.ALL;
ECanaShady.CANRIOC.ALL = ECanaRegs.CANRIOC.ALL;
ECanaShady.CANRIOC.bit.RXFUNC = 1;
ECANaRegs.CANRIOC.ALL = ECANaShady.CANRIOC.ALL;
/*将 eCAN 配置为 HECC 模式-(需要访问邮箱16至31)*/
// HECC 模式也启用时间戳功能
ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECanaShading.CANMC.bit.SCB = 1;
ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
/*将"消息控制寄存器"的所有位初始化为零*/
// MSGCTRL 寄存器的某些位出现在未知状态。 为确保正常运行、
// MSGCTRL 的所有位(包括保留位)都必须初始化为零
ECANaMboxs.MBOX0.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX1.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX2.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX3.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX4.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX5.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX6.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX7.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX8.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX9.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX10.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX11.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX12.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX13.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX14.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX15.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX16.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX17.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX18.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX19.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX20.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX21.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX22.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX23.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX24.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX25.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX26.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX27.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX28.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX29.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX30.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX31.MSGCTRL.ALL = 0x00000000;
// TAN、RMPn、GIFn 位在复位时都为零并且再次被清零
// 作为预防措施。
ECANARegs.CANTA.ALL = 0xFFFFFFFF; //清除所有 Tan 位*/
ECANaRegs.CANRMP.ALL = 0xFFFFFFFF; //清除所有 RMPn 位*/
ECANaRegs.CANGIF0.ALL = 0xFFFFFFFF;//清除所有中断标志位*/
ECANaRegs.CANGIF1.ALL = 0xFFFFFFFF;
/*为 eCANA*/配置位定时参数
ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECanaShady.CANMC.bit.CCR = 1; //设置 CCR = 1
ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
//等待 CPU 被授予更改配置寄存器的权限
操作
{
ECanaShady.canes.all = ECanaRegs.canes.all;
} while (ECanaShading.canes.bit.CCE!= 1); //等待 CCE 位被置位。
ECanaShady.CANBTC.ALL = 0;
ECanaShady.CANBTC.all =0x000203BD;//0x000503BD = 500k;;0x000203BD;=1Mbps 时钟90MHz
ECANaRegs.CANBTC.ALL = ECANaShady.CANBTC.ALL;
ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECanaShady.CANMC.bit.CCR = 0; //设置 CCR = 0
ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
//等待 CPU 不再具有更改配置寄存器的权限
操作
{
ECanaShady.canes.all = ECanaRegs.canes.all;
} while (ECanaShading.canes.bit.CCE!= 0); //等待 CCE 位 被清除。
/*禁用所有邮箱 */
ECANaRegs.CANME.ALL = 0; //在写入 MSGID 之前需要
EDIS;
}
>>> Rx 代码结束>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<< CAN Tx 代码 TMS570LS4x <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
canInit();
uint8 CAN_DATA[1]={0xAA};
while (1)
{
canTransmit (canREG1、canMESSAGE_BOX1、&CAN_DATA[0]);
memset (rx_data、0、sizeof (rx_data));
等待(0xFFF);
}图标* 主函数结束***
空 canInit (空)
{
/**-设置控制寄存器
* -禁用总线活动时的自动唤醒
* -禁用本地断电模式
* -禁用 DMA 请求线路
* -启用全局中断线路0和1
* -禁用调试模式
* -从软件复位中释放
* -启用/禁用奇偶校验或 ECC
* -启用/禁用计时器上的自动总线
* -进入调试状态之前设置消息完成
* -设置正常操作模式
* -请求对配置寄存器的写入访问
* -设置消息的自动重新传输
* -禁用错误中断
* -禁用状态中断
* -进入初始化模式
*
CANREG1->CTL =(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32)((UINT32) 0x00000005U << 10U)
|(UINT32) 0x00020043U;
/**-清除所有挂起的错误标志并重置当前状态*/
canREG1->ES |= 0xFFFFFFU;
/**-为消息分配中断级别*/
CANREG1->INTMUXx[0U]=(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U;
/**-在定时器周期上设置自动总线*/
canREG1->ABOTR =(uint32) 0U;
/**-初始化消息1.
* -等待 IF1就绪可供使用
* -设置消息掩码
* -设置消息控制字
* -设置消息仲裁
* -设置 IF1控制字节
* -设置 IF1消息编号
*
/*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
while ((canREG1->IF1STAT & 0x80U)=0x80U)
{
}/*等待*/
CANREG1->IF1MSK = 0xC0000000U |(UINT32)((UINT32)((UINT32) 0x00007FFU &(UINT32) 0x1FFFFFFFU)<<(UINT32) 0U);
CANREG1->IF1ARB =(uint32) 0x800000U |(uint32) 0x40000000U |(uint32) 0x20000000U |(uint32)(((uint32) 1U &(uint32) 0x1FFFFFFFU)<<(uint32) 0U);
CANREG1->IF1MCTL = 0x00001000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 8U;
CANREG1->IF1CMD =(uint8) 0xF8U;
canREG1->IF1NO = 1U;
/**-设置 IF1以进行数据传输
* -等待 IF1就绪可供使用
* -设置 IF1控制字节
*
/*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
while ((canREG1->IF1STAT & 0x80U)=0x80U)
{
}/*等待*/
CANREG1->IF1CMD = 0x87U;
/**-设置 IF2以读取数据
* -等待 IF1就绪可供使用
* -设置 IF1控制字节
*
/*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
while ((canREG1->IF2STAT & 0x80U)=0x80U)
{
}/*等待*/
CANREG1->IF2CMD = 0x17U;
/**-设置位时序
* -设置波特率预分频器扩展
* -设置 TSeg2
* -设置 TSeg1
* -设置样本跳转宽度
* -设置波特率预分频器
*
canREG1->BTR =(uint32)((uint32) 0U << 16U)|
(uint32)((uint32)(1U-1U)<<12U)|
(uint32)((uint32)((7U + 1U)- 1U)<<8U)|
(uint32)((uint32)(1U-1U)<<6U)|
(uint32) 7U;
/**- CAN1端口输出值*/
canREG1->TIOC = (UINT32)((UINT32) 1U <<18U)
|(uint32)((uint32) 0U <<17U)
|(uint32)((uint32) 0U <<16U)
|(uint32)((uint32) 1U <<3U)
|(uint32)((uint32) 1U <<2U)
|(uint32)((uint32) 1U <<1U);
canREG1->RIOC = (UINT32)((UINT32) 1U <<18U)
|(uint32)((uint32) 0U <<17U)
|(uint32)((uint32) 0U <<16U)
|(uint32)((uint32) 1U <<3U)
|(uint32)((uint32) 0U <<2U)
|(uint32)((uint32) 0U <<1U);
/**-离开配置和初始化模式 */
canREG1->CTL &=~(uint32)(0x00000041U);
}
提前感谢..

