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.

[参考译文] TMS570LS1227:SPI 数据 DMA 传输的字节被加码

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1046789/tms570ls1227-byte-garbled-for-spi-data-dma-transfer

器件型号:TMS570LS1227

现象:

 数据被反相:发送数据为1、2、3、4、5、6、7、8、 收到的实际数据为:2、1、4、3、6、5、 8 7.

代码如下:

/*用户代码开始(0)*/
/*用户代码结束*/

/*包含文件*/

#include "sys_common.h"

/*用户代码开始(1)*/
#include "sys_vim.h"
#include "ESM.h"
#include "CAN.h"
#include "DCC.h"
#include "sys_core.h"
#include "spi.h"
#include "system.h"
#include "rti.h"
#include "data.h"
#include "sys_dma.h"
#include
#include
/*用户代码结束*/

/**@fn void main (void)
*@应用程序主函数简介
*@请注意、默认情况下、此函数为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
*

/*用户代码开始(2)*/
#define D_Size2 9.

uint8 Tx_data[D_Size2]={'H'、'E'、'R'、'C'、'U'、 'L'、'E'、'S'、'\0'};
uint8 Tx1_DATA[D_Size2]={"S"、"F"、"F"、"E"、"R"、 'A'、'G'、'V'、'\0'};
UINT8 Rx_DATA[D_Size2]={0};
uint8 num;
uint32 ID_DATA[8];
/*uint32错误= 0;*/
/*SPI 数据定义*/
UINT16 TG0_TX_DATA[8]={0x1000、0x1111、0x1222、0x1333、0x1444、 0x1555、
0x1666、0x1777};
UINT16 TG0_RX_DATA[8]={0};

UINT16 TG1_TX_DATA[8]={0x2000、0x2111、0x2222、0x2333、0x2444、 0x2555、
0x2666、0x2777};
UINT16 TG1_RX_DATA[8]={0};

uint16 TG2_TX_DATA[8]={0x3000、0x3111、0x3222、0x3333、0x3444、 0x3555、
0x3666、0x3777};
UINT16 TG2_RX_DATA[8]={0};

uint16 tg3_TX_DATA[8]={0x4000、0x4111、0x4222、0x4333、0x4444、 0x4555、
0x4666、0x4777};
uint16 tg3_RX_DATA[8]={0};

uint32_t tg3_is 完整;

uint32 checkPackets (uint8 * src_packet、uint8 * dst_packet、uint32 psize);

#define D_COUNT 8.

uint32 cnt = 0、ERROR = 0、TX_DONE = 0;
uint8 TX_DATA[D_COUNT][8]={0};
uint8 rx_data[D_count][8]={0};
uint8 tx1_data[D_count][8]={0};
uint8 rx1_data[D_count][8]={0};
uint8 * TX_ptr =&TX_DATA[0][0];
uint8 * rx_ptr =&rx_data[0];
uint8 *tx1_ptr =&tx1_data[0];
uint8 * rx1_ptr =&rx1_data[0];
uint8 *dptr = 0;

空 dumpSometData();

#define D1_SIZE 127
void loadDataPattern (uint32 psize、uint16* pptr);
void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint16 dsize、uint16 blocksize);
void dmaConfigCtrlTxPacket (uint32 Sadd、uint32 dadd、uint16 dsize、uint16 blocksize);
unsigned int SPI_TestVerify ();

/*示例数据模式配置*/
//#define SPI1_RXBUF 0xFFF7F442
//#define SPI3_TXBUF 0xFFF7F83E
#define SPI4_TX_ADDR ((uint32_t)(&(spiREG4->DAT1))+ 2)
#define SPI4_RX_ADDR ((uint32_t)(&(spiREG4->BUF))+ 2)


unsigned int blocksize = 100;

无符号短整型 TX_DATA[100];
uint8 TX_TEST[8]={1、2、3、4、5、6、7、8};
uint8 rx_test[8]={0};
无符号短 RX_DATA[100]={0};
unsigned int SPI4_HBCFlag = 0;
unsigned int SPI4_BTCTFlag = 0;

unsigned int txrx_error;

G_dmaCTRL g_dmaCTRLPKT_TX、g_dmaCTRLPKT_RX;/* DMA 控制数据包配置堆栈*


/*用户代码结束*/

int main (空)

/*用户代码开始(3)*/
int i=0;
spiDAT1_t 数据通信 fig1_t;
dataconfig1_t.CS_hold = false;
dataconfig1_t.WDEL = true;
dataconfig1_t.DFSEL = SPI_FMT_0;
dataconfig1_t.CSNR = 0xFE;

tg3_is _complete = 0x55555555;
_enable_interrupt_();
_enable_IRQ ();

rtiInit();
canInit();
dccInit();
spiInit();

rtiEnableNotification (rtiNOTIFICATION_COMPARE0);
rtiStartCounter (rtiCOUNTER_BLOCK0);

canEnabableeloopback (canREG1、Internal_LBK);
canEnableErrorNotification (canREG1);
canEnableErrorNotification (canREG2);

spiEnableNotification (spiREG4、1);
SendspiAndGetData (spiREG4、&dataconfig1_t、16、TG0_TX_DATA、TG0_RX_DATA);

/***** DMA ******* /
操作


/*-启用 DMA 模块*/
dmaEnable();


/*接收数据后启用中断*/
dmaEnableInterrupt (DMA_CH0、FTC);//帧传输完成

/*-分配 DMA 请求:带有请求线路的通道0 - 0/15 */
dmaReqAssign (DMA_CH1、24);//请求行24:SPI4 RX
dmaReqAssign (DMA_CH2、25);//请求行25:SPI4 TX

/*-配置 DMA TX 控制数据包*/

dmaConfigCtrlTxPacket (TX_TEST、SPI4_TX_ADDR、1、4);
dmaSetCtrlPacket (DMA_CH2、g_dmaCTRLPKT_TX);


dmaConfigCtrlRxPacket (SPI4_RX_ADDR、Rx_TEST、1、4);
dmaSetCtrlPacket (DMA_CH1、g_dmaCTRLPKT_RX);


/*-将 DMA 通道设置为在硬件请求时触发*/
dmaSetChEnable (DMA_CH1、DMA_HW);//SPI1 RX、硬件触发
dmaSetChEnable (DMA_CH2、DMA_HW);//SPI3 TX、硬件触发
spiREG4->GCR1 =(spiREG4->GCR1 & 0xFFFFFFFFU)|(0x1 << 24);//启用 SPI
spiREF4->INT0 =(0x1 << 16);//SPI_DMAREQ;仅在将 SPIEN 位设置为1后启用 DMA 请求。

/*while (SPI4_BTCTFlag =0)
{//DMA 块完成中断

IF (SPI4_BTCLag = 1)

spiREG4->PC3 = 0x01;//CS[0]= 1
txrx_error = SPI_TestVerify ();//检查复用数据是否与 txed 数据相同
}*/



while (txrx_error>0);
while (1)



/*用户代码结束*/

返回0;


/*用户代码开始(4)*/

void canMessageNotification (canbase_t *节点、uint32 MessageBox)

/*在用户代码开始和用户代码结束之间输入用户代码。 *
/*用户代码开始(15)*/

如果(节点== canREG1)

TX_DONE = 1;//确认传输请求*/
while (!canIsRxMessageArrived (canREG1、canMESSAGE_BOX2))

canGetData (canREG1、canMESSAGE_BOX5、Rx_DATA);//复制到 RAM *
canTransmit (canREG1、canMESSAGE_BOX1、Rx_DATA);
//rx1_ptr +=8;

/*节点2 -接收完成*/
如果(节点== canREG2)

while (!canIsRxMessageArrived (canREG2、canMESSAGE_BOX1))

canGetData (canREG2、canMESSAGE_BOX1、Rx_PTR);//复制到 RAM *
ID_DATA[num]= canGetID (canREG2、canMESSAGE_BOX1);
num++;
如果(num > 8)
num = 0;
RX_PTR += 8;

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

if (inttype =HBC){
SPI4_HBCFlag = 1;

否则、如果(inttype = BTC){
SPI4_BTCLag = 1;


//DMA 接收数据初始化
void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint16 ElmntCnt、uint16 FrameCnt)

G_dmaCTRLPKT_RX.Sadd =添加;/*源地址*
G_dmaCTRLPKT_RX.DADD =添加;/*目标地址*
G_dmaCTRLPKT_RX.CHCTRL = 0;/*通道控制*
G_dmaCTRLPKT_RX.FRCNT =帧计数;/*帧计数*
G_dmaCTRLPKT_RX.ELCNT = ElmntCnt;/*元素计数*
G_dmaCTRLPKPT_RX.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPPKT_RX.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKPT_RX.FRDOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKPT_RX.FRSOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT_RX.PORTASGN = 4;/*端口 b *
G_dmaCTRPKT_RX.RDSIZE = ACCESS_16_BIT;/*读取大小*
G_dmaCTRLPKT_RX.WRSIZE = ACCESS_16_BIT;/*写入大小*
G_dmaCTRLPKT_RX.tType = FRAME_TRANSFSION;/*传输类型*/
G_dmaCTRPKT_RX.ADDMODERD = ADDR_FIXED;/*地址模式读取*
G_dmaCTRPKT_RX.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRPKT_RX.AUTOINIT = AUTOINIT_ON;/*自动初始化*

//DMA 发送数据初始化
void dmaConfigCtrlTxPacket (uint32 Sadd、uint32 dadd、uint16 ElmntCnt、uint16 FrameCnt)

G_dmaCTRLPKT_TX.Sadd =添加;/*源地址*
G_dmaCTRLPKT_TX.DADD = dadd;/*目标地址*
G_dmaCTRLPKT_TX.CHCTTRL = 0;/*通道控制*
G_dmaCTRLPKT_TX.FRCNT =帧计数;/*帧计数*
G_dmaCTRLPKT_TX.ELCNT = ElmntCnt;/*元素计数*
G_dmaCTRLPKPT_TX.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKPT_TX.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKPT_TX.FRDOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKPT_TX.FRSOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT_TX.PORTASGN = 4;/*端口 b *
G_dmaCTRLPKT_TX.RDSIZE = ACCESS_16_BIT;/*读取大小*
G_dmaCTRLPKT_TX.WRSIZE = ACCESS_16_BIT;/*写入大小*
G_dmaCTRLPKT_TX.tType = FRAME_TRANSFSION;/*传输类型*/
G_dmaCTRPKT_TX.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKPT_TX.ADDMODEWR = ADDR_FIXED;/*地址模式写入*
G_dmaCTRPKT_TX.AUTOINIT = AUTOINIT_ON;/*自动初始化*

void loadDataPattern (uint32 psize、uint16* pptr)

*pptr = 0x0;
while (psize--)

//*pptr = 0x1111 +*pptr++;
*pptr++= psize + 0x5A00;

unsigned int SPI_TestVerify ()

寄存器无符号短整型 I;
寄存器 unsigned int 错误;
寄存器 unsigned short * dst_address;

//使用传输的数据检查接收到的数据
误差= 0;

if (SPI4_HBCFlag > 0)

dst_address = RX_DATA;
对于(i=0;i<50;i++){
if (* dst_address++!= TX_DATA[i])

错误++;



其他

dst_address =&RX_DATA[50];
对于(i=50;i<100;i++){
if (* dst_address++!= TX_DATA[i])

错误++;



返回错误;

/*用户代码结束*/

请帮您检查一下。

谢谢!

此致、

樱桃周

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

    您好!

    我是否可以知道有任何更新?

    谢谢!

    此致、

    樱桃

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

    您好、Cherry、

    已查看您的代码。 请更改:

    uint8 TX_TEST[8]={1、2、3、4、5、6、7、8};
    uint8 rx_test[8]={0};

    更改为

    uint16 TX_TEST[8]={1、2、3、4、5、6、7、8};
    uint16 rx_test[8]={0};