This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LS1114:CAN 功能问题

Guru**** 2394075 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/981103/tms570ls1114-can-function-issue

器件型号:TMS570LS1114

设计

请帮助我检查以下代码,我的问题是 IF3数据无法与 IF2同步!

#include "all_header.h"
#include "system.h"
#include "EMIF.h"
#include "errata_SSWF021_45.h"
#include "etpwm.h"
#include "sys_dma.h"


#include "reg_etpwm.h"

#include
#include

静态 uint32_t Received_ID;/*SD_20210119*/

静态 UINT32 DMA_Comp_Flag;

g_dmaCTRL g_dmaCTRLPKT;/*DMA 控制数据包配置堆栈*/

#define D_COUNT 8.
#define D_SIZE 8

int 数据;

uint32 cnt = 0;
uint32错误= 0;
uint32 TX_DONE = 0;
uint32 CPUCount = 0;
uint32 timer0=0;


uint8_t TX_data1[D_count]={1、2、3、4、4、4、 3、2、1};/*系统 ram*/中的传输缓冲区
uint8_t TX_data2[D_count]={1、3、5、7、9、 11、13、15};
uint8_t TX_data3[D_count]={2、4、6、8、10、 12、14、16};

uint8_t rx_data[D_count]={0};
uint8_t rx_data1[D_count]={0};/*系统 ram*/中的接收缓冲区
uint8_t rx_data2[D_count]={0};
uint8_t rx_data3[D_count]={0};

空延迟(uint32时间);
void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize);
uint32 checkPackets (uint8 * src_packet、uint8 * dst_packet、uint32 psize);


void dmaGroupA 通知(dmaInterrupt_t inttype、uint32通道)

DMA_Comp_Flag = 0x5555AAAA;


空延迟(uint32时间)

int i;

对于(i = 0;i <时间;i++)


void main (void)

_enable_interrupt_();/*在 ARM CPSR 寄存器中启用 IRQ 中断*/
DMA_Comp_Flag = 0xAAAA5555;//重置标志*

rtiInit();
rtiEnableNotification (rtiNOTIFICATION_COMPARE0);
// rtiDisableNotification (rtiNOTIFICATION_COMPARE0);
_enable_IRQ ();
rtiStartCounter (rtiCOUNTER_BLOCK0);

u8gv_tmr_addr = get_tmr_addr ();
canInit();/*初始化 CAN*/
vimInit();

canREG1->CTL |=(UINT32)(1<<18);/*为 IF1*/启用 DMA DE1
canREG1->CTL |=(UINT32)(1<<19);/*为 IF2*/启用 DMA DE2
CANREG1->CTL |=(UINT32)(1<<20);/*启用 CTL 寄存器中的 DE3位以在 IF3接收数据时触发 DMA */
canREG1->IF3OBS = 0x0000001AU;//读取 ARB、数据 A 和 B - 8字节*/
canREG1->IF3UEy[0]= 0x0000002AU;/*配置为自动更新的 RX 2、4、6的消息框*/


/*- DMA 配置*/
dmaEnable();//启用 DMA */
// dmaEnableInterrupt (DMA_CH16、FTC);//在接收数据后启用中断*/
dmaEnableInterrupt (DMA_CH0、FTC);

// dmaReqAssign (DMA_CH2、17);/* DMA 配置和启用 DMA:DCAN1 IF1对应DMAREQ [17]*/
// dmaReqAssign (DMA_CH1、6);/*DCAN1 IF2对应DMAREQ [6]*/
dmaReqAssign (DMA_CH0、16);/*DCAN1 IF3对应请求线DMAREQ [16]*/
// canEnabableeloopback (canREG1、Internal_LBK);

/*-填充 DMA 控制数据包结构*/
/*源地址= IF3数据寄存器
*目标=系统 RAM 中的接收缓冲器
*长度= 1 (64位= 8 * 8字节)
*
// dmaConfigCtrlRxPacket ((uint32)(&TX_data2)、(uint32)(&(canREG1->IF1DATx[0]))、1);
dmaConfigCtrlRxPacket ((uint32)(&(canREG1->IF3DATx[0]))、(uint32)(&Rx_data2)、1);
// dmaConfigCtrlRxPacket ((uint32)(&Rx_data2)、(uint32)(&(canREG1->IF2DATx[0]))、1);

dmaSetCtrlPacket (dma_ch0、g_dmaCTRLPKT);/*设置用于传输的 DMA 控制包*/
// dmaSetCtrlPacket (dma_ch1、g_dmaCTRLPKT);
// dmaSetCtrlPacket (dma_ch2、g_dmaCTRLPKT);

dmaSetChEnable (DMA_CH0、DMA_SW);/* CH0使能,IF1填充数据*/
// dmaSetChEnable (DMA_CH1、DMA_SW);


#if 1.
while (1)

// printf ("can tx\n");
延迟(100000);

DMA_Comp_Flag = 0xAAAA5555;//重置标志*

canTransmit (canREG1、canMESSAGE_box3、(const uint8 *)&TX_data2[0]);//在 CAN1上传输*
// canIsTxMessagePending (canREG1、canMESSAGE_box3);
CPUCount = canIsTxMessagePending (canREG1、canMESSAGE_box3);

// can1LowLevelInterrupt ();
// can1HighLevelInterrupt ();

while (!canIsRxMessageArrived (canREG1、canMESSAGE_BOX4))

dmaFTCAInterrupt();
while (dma_Comp_Flag!= 0x5555AAAA);//等待 DMA 中断 ISR 设置 Flag *
canGetData (canREG1、canMESSAGE_BOX4、(uint8 *)&Rx_DATA[0]);// CAN1上的接收*/
Received_ID =(canREG1->IF3ARB & 0x1FFC0000">18;


#endif

返回0;


void canMessageNotification (canBASE-t *节点、uint32_t MessageBox)

while (!canIsRxMessageArrived (canREG1、canMESSAGE_BOX4))

canGetData (canREG1、canMESSAGE_BOX4、(uint8 *)&Rx_DATA[0]);
Received_ID =(canREG1->IF3ARB & 0x1FFC0000">18;

/*
switch (Rx_DATA[0])

案例13:
数据=(Rx_DATA[1]- 0x30)* 1000 +(Rx_DATA[2]- 0x30)* 100 +(Rx_DATA[3]-0x30)* 10 + Rx_DATA[4]- 0x30;
数据*= 1.25;
中断;
默认值:
中断;

etpwmREG1->CMPA =数据;

memset (rx_data、0、sizeof (rx_data));
数据= 0;
*

#pragma weak (rtiNotification)
void rtiNotification (uint32通知)

/*重置标志*/
timer0 ++;


void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize)

G_dmaCTRLPKT.Sadd =添加;//源地址*/
G_dmaCTRLPKT.DADD =添加;/*目标地址*/
G_dmaCTRLPKT.CHCTRL = 0;/*通道控制*/
G_dmaCTRLPKT.FRCNT = 1;/*帧计数*/
G_dmaCTRLPKT.ELCNT = dsize;/*元素计数*/
G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.ELSOFFSET = 0;/*元素源偏移*
G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.FRSOFFSET = 0;/*帧源偏移*
G_dmaCTRLPKT.PORTASGN = 4;/*端口 b *
G_dmaCTRLPKT.RDSIZE = ACCESS_64_BIT;/*读取大小*
G_dmaCTRLPKT.WRSIZE = ACCESS_64_BIT;/*写入大小*
G_dmaCTRLPKT.tType = FRAME_TRANSFSION;/* TRANSFSION TYPE 一个请求触发一帧传输*
G_dmaCTRLPKT.ADDMODERD = ADDR_FIXED;/*地址模式读取*/
G_dmaCTRLPKT.ADDMODEWR = ADDR_FIXED;/*地址模式写入*/
G_dmaCTRLPKT.AUTOINIT = AUTOINIT_ON;/*自动初始化*/

/*用户代码结束*/

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Cooper、您好!

    您能回答您的问题吗? 我无法从您的代码中获取该点。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的王:

    使用 CAN 功能时、配置 IF1进行数据发送、配置 IF2进行数据接收、配置 IF3进行数据监控;发现 IF2数据在接收时已更新、但 IF3监控的数据保持不变,因此我不知道发生了什么。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    从邮箱3传输数据后、请检查 IF3x 数据寄存器是否更新。  

    在 DMA 通知函数中添加断点时、代码是否会运行到此断点? 如果没有、请检查是否启用了用于 DMA 中断的 VIM 通道(VIM 通道33)?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的王:

    我想知道,在 CAN 通信中,我将 IF2配置为 RX,IF3使用 DMA 监视数据。 这两者的数据源在哪里、有何差异?

    为什么接收到的数据不同(我在调试模式下运行、是否重要?)我使用两个 CPU 发送不同的数据 A 和 B、为什么 I IF2和 IF3接收不同的数据? 一个显示接收数据 A、另一个显示数据 B
    此外、当我运行一个单步执行时、我可以在 IF2寄存器中看到接收到的数据、而当我运行一个连续运行时、数据不会显示在 IF2中。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的王:

    IF3x 数据寄存器已更新>>回答: 我配置了寄存器:canREG1->IF3UEy[0]= 0x0000002AU;/*配置为自动更新的 RX 2、4、6消息框*/

    请检查是否启用了用于 DMA 中断的 VIM 通道(VIM 通道33)>>回答:我的代码无法进入此中断,我不知道原因,这是我的代码更新如下,请帮助检查!

    #include "all_header.h"
    #include "system.h"
    #include "EMIF.h"
    #include "errata_SSWF021_45.h"
    #include "etpwm.h"
    #include "sys_dma.h"
    #include "reg_etpwm.h"
    #include
    #include

    静态 uint32_t Received_ID;/*SD_20210119*/
    静态 UINT32 DMA_Comp_Flag;

    g_dmaCTRL g_dmaCTRLPKT;/*DMA 控制数据包配置堆栈*/

    #define D_COUNT 8.
    #define D_SIZE 8

    int 数据;

    uint32 cnt = 0;
    uint32错误= 0;
    uint32 TX_DONE = 0;
    uint32 CPUCount = 0;
    uint32 timer0=0;

    uint8_t TX_data1[D_count]={1、2、3、4、4、4、 3、2、1};/*系统 ram*/中的传输缓冲区
    uint8_t TX_data2[D_count]={1、3、5、7、9、 11、13、15};
    uint8_t TX_data3[D_count]={2、4、6、8、10、 12、14、16};

    uint8_t rx_data[D_count]={0};/*系统 ram*/中的接收缓冲区
    /*
    uint8_t Rx_data1[D_count]={0};
    uint8_t rx_data2[D_count]={0};
    uint8_t rx_data3[D_count]={0};
    *
    空延迟(uint32时间);
    void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize);
    void dmaGroupANotification (dmaInterrupt_t inttype、uint32通道);

    DMA_Comp_Flag = 0x5555AAAA;

    空延迟(uint32时间)

    int i;

    对于(i = 0;i <时间;i++)


    void main (void)

    _enable_interrupt_();/*在 ARM CPSR 寄存器中启用 IRQ 中断*/
    DMA_Comp_Flag = 0xAAAA5555;//重置标志*

    u8gv_tmr_addr = get_tmr_addr ();
    canInit();/*初始化 CAN*/

    CANREG1->CTL |=(UINT32)(1<<20);/*启用 CTL 寄存器中的 DE3位以在 IF3接收数据时触发 DMA */
    canREG1->IF3OBS = 0x0000001AU;//读取 ARB、数据 A 和 B - 8字节*/
    canREG1->IF3UEy[0]= 0x0000002AU;/*配置为自动更新的 RX 2、4、6的消息框*/

    /*- DMA 配置*/
    dmaEnable();//启用 DMA */
    /*==== RX DMA===== *
    dmaEnableInterrupt (DMA_CH0、FTC);//在接收数据后启用中断*
    dmaReqAssign (DMA_CH0、16U);/*分配 DMA 请求:带有请求线路的通道0 - 16 (DCAN1IF3)*/
    vimEnableInterrupt (33U、SYS_IRQ);// VIM DMA FTCA:帧传输完成*/

    /*-填充 DMA 控制数据包结构*/
    /*源地址= IF3数据寄存器
    *目标=系统 RAM 中的接收缓冲器
    *长度= 1 (64位= 8 * 8字节)
    *
    dmaConfigCtrlRxPacket ((uint32)(&(canREG1->IF3DATx[0]))、(uint32)(&Rx_DATA)、1);
    dmaSetCtrlPacket (dma_ch0、g_dmaCTRLPKT);/*设置用于传输的 DMA 控制包*/
    dmaREG->GCHIENAS |= 1<

    /*==== RX DMA end === *


    #if 1.
    while (1)

    // printf ("can tx\n");
    //延迟(10000000);/*0.1us*10000000=1s=1000ms*/

    DMA_Comp_Flag = 0xAAAA5555;//重置标志*
    canTransmit (canREG1、canMESSAGE_box3、(const uint8 *)&TX_data2[0]);//在 CAN1上传输*
    dmaFTCAInterrupt();
    while (dma_Comp_Flag!= 0x5555AAAA);//等待 DMA 中断 ISR 设置 Flag *


    #endif

    返回0;

    void canMessageNotification (canBASE-t *节点、uint32_t MessageBox)

    Received_ID =(canREG1->IF3ARB & 0x1FFC0000">18;

    /*-将 DMA 通道设置为在软件请求时触发*/
    dmaSetChEnable (DMA_CH0、DMA_SW);

    void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize)

    G_dmaCTRLPKT.Sadd =添加;//源地址*/
    G_dmaCTRLPKT.DADD =添加;/*目标地址*/
    G_dmaCTRLPKT.CHCTRL = 0;/*通道控制*/
    G_dmaCTRLPKT.FRCNT = 1;/*帧计数*/
    G_dmaCTRLPKT.ELCNT = dsize;/*元素计数*/
    G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
    G_dmaCTRLPKT.ELSOFFSET = 0;/*元素源偏移*
    G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
    G_dmaCTRLPKT.FRSOFFSET = 0;/*帧源偏移*
    G_dmaCTRLPKT.PORTASGN = 4;/*端口 b *
    G_dmaCTRLPKT.RDSIZE = ACCESS_64_BIT;/*读取大小*
    G_dmaCTRLPKT.WRSIZE = ACCESS_64_BIT;/*写入大小*
    G_dmaCTRLPKT.tType = FRAME_TRANSFSION;/* TRANSFSION TYPE 一个请求触发一帧传输*
    G_dmaCTRLPKT.ADDMODERD = ADDR_FIXED;/*地址模式读取*/
    G_dmaCTRLPKT.ADDMODEWR = ADDR_FIXED;/*地址模式写入*/
    G_dmaCTRLPKT.AUTOINIT = AUTOINIT_ON;/*自动初始化*/

    /*用户代码结束*/

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Copper、

    IF2读取是指将报文对象从 CAN 报文 RAM 读取到 IF2寄存器。 源是 CAN 报文 RAM 中的报文对象、目的是 IFx 寄存器。  canGetData()函数将数据从 IF2数据寄存器复制到 MCU SRAM 中的数据数组。

    IF3数据寄存器随接收到的报文对象自动更新。 DMA 传输的数据源地址是 IF3数据寄存器、目标地址是 MCU SRAM 中的数据阵列。  

    当你运行单步执行时、你是否检查了 IF3数据寄存器中的数据? IF3数据寄存器中的数据是否与 IF2数据寄存器中的数据不同?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我今天晚上进行了一次测试。 没有问题。

    IF3x 数据与发送的数据完全相同(IF1x 数据 A/B 寄存器)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请将元素大小从64更改为32

    G_dmaCTRLPKT.RDSIZE = ACCESS_32_BIT;/*读取大小*
    G_dmaCTRLPKT.WRSIZE = ACCESS_32_BIT;/*写入大小*
    G_dmaCTRLPKT.tType = FRAME_TRANSFSION;/* TRANSFSION TYPE 一个请求触发一帧传输*
    G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
    G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*

    更改元素数量:

    dmaConfigCtrlRxPacket ((uint32)(&(canREG1->IF3DATx[0]))、(uint32)(&Rx_DATA)、2);