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.

[参考译文] Starterware/TMS570LS0714:2 TMS570 SPI 通信问题(主器件和从器件)

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/604523/starterware-tms570ls0714-2-tms570-spi-comunication-problem-master-and-slave

器件型号:TMS570LS0714

工具/软件:Starterware

尊敬的所有人:

我   的 SPI 有两个问题、用于两个 TMS570LS0714 通信。

 下面的 H/W 连接: 一个主器件、一个从器件。  SIMO->SIMO、SOMI->SOMI、CLK->CLK、无其它。

下面的程序思想: 主机在1ms 中断(HET 中断、运行良好)内发送数据[20]和接收数据[20]。从机在1ms 中断(HET 中断、运行良好)内发送数据[20]和接收数据[20]。

但主机可以发送数据(校验寄存器)、而不是接收数据。 从器件都不能。   检查从机寄存器,Flg 寄存器为0x340表示溢出。   当我手动清除0x340时,我可以看到从机 只发送和接收一个数据,然后 FLG 为0x340。  

我不知道如何解决这个问题,请帮我。  

我的以下代码:

主器件:

void _InitSpi3 (spiBASE-t * SpiInfo)

/*@b 初始化@b SPI3 */
/**使 SPI 退出复位*/
SpiInfo->GCR0 = 1U;

/** SPI2主控模式和时钟配置*/
SpiInfo->GCR1 =(1 << 1)/* CLOKMOD */
|1;/*主设备*/

/** SPI3使能引脚配置*/
// spiREG3->ENAHIGHZ = 0;//启用 HIGHZ *//lugh 测试

/**-延迟*/
SpiInfo->Delay =(4 << 24)/* C2TDELAY */
|(4 << 16)/* T2CDELAY */
|(0 << 8)/* T2EDELAY */
| 0;// C2EDELAY */

/**-数据格式0 */
SpiInfo->FMT0 =(63 <<24)/* wdelay */
|(0 << 23)/*奇偶极性*/
|(0 << 22)/*奇偶校验使能*/
|(0 << 21)//等待启用*/
|(0 < 20)/*换向*/
|(0 < 17)/*时钟极性*/
|(0 < 16)/*时钟相位*/
|(79 << 8)/*波特率预分频、1M Hz *//lugh
//|(7 << 8)//*波特率预分频,10M Hz */
|16;/*数据字长度*/

/**-设置中断级别*/
SpiInfo->LVL =(0 << 9)/* TXINT */
|(0 < 8)/* RXINT */
|(0 << 6)/* OVRNINT */
|(0 << 4)/* BITERR */
|(0 < 3)/* DESYNC */
|(0 << 2)/* PARERR */
|(0 << 1)/*超时*/
|(0);/* DLENERR */

/**-清除所有挂起的中断*/
SpiInfo->FLG = 0xFFFFFFU;

/**-启用中断*/
SpiInfo->INT0 =(0 << 9)/* TXINT */
|(0 < 8)/* RXINT */
|(0 << 6)/* OVRNINT */
|(0 << 4)/* BITERR */
|(0 < 3)/* DESYNC */
|(0 << 2)/* PARERR */
|(0 << 1)/*超时*/
|(0);/* DLENERR */

/**@b 初始化@b SPI3 @b 端口*/

/**- SPI3端口输出值*/
SpiInfo->PC3 = 1/* SCS[0]*/
|(0 < 8)/* ENA */
|(0 << 9)/* CLK */
|(0 < 10)/* SIMO */
|(0 < 11);/* SOMI */

/**- SPI3端口方向*/
SpiInfo->PC1 = 1/* SCS[0]*/
|(0 < 8)/* ENA */
|(1 << 9)/* CLK */
|(1 << 10)/* SIMO */
|(0 < 11);/* SOMI */

/**- SPI3端口开漏使能*/
SpiInfo->PC6 = 0 /* SCS[0]*/
|(0 < 8)/* ENA */
|(0 << 9)/* CLK */
|(0 < 10)/* SIMO */
|(0 < 11);/* SOMI */

/**- SPI3端口上拉/下拉选择*/
SpiInfo->PC8 = 1/* SCS[0]*/
|(1 << 8)/* ENA */
|(1 << 9)/* CLK */
|(1 << 10)/* SIMO */
|(1 << 11);/* SOMI */

/**- SPI3端口上拉/下拉使能*/
SpiInfo->PC7 = 0 /* SCS[0]*/
|(0 < 8)/* ENA */
|(0 << 9)/* CLK */
|(0 < 10)/* SIMO */
|(0 < 11);/* SOMI */

/* SPI2将所有引脚设置为功能*/
SpiInfo->PC0 = 0 /* SCS[0]*/
|(0 < 8)/* ENA */
|(1 << 9)/* CLK */
|(1 << 10)/* SIMO */
|(1 << 11);/* SOMI */

/**-初始化 TX 和 RX 数据缓冲区状态*/
G_spiPacket_t[0].TX_DATA_STATUS = SPI_READY;
G_spiPacket_t[0].Rx_DATA_STATUS = SPI_READY;

/*用于 EM 配置的 EmbDataRegCfg。 *
EMDataRegCfg.CSNR = 1;
EMDataRegCfg.CS_HOLD = 1;
EMDataRegCfg.DFSEL = SPI_FMT_0;
EMDataRegCfg.WDEL = 1;

/**-最后启动 SPI3 */
SpiInfo->GCR1 |=(uint32)((uint32) 1U <<24U);/* SPI3启用*/

UINT32 SPI_TransmitAndReceiveData (spiBASE-t * SPI、UINT32块大小、
uint16 * srcbuff、uint16 * destbuff)

静态 uint16 Tx_Data;
uint16 RecvCnt=0;/*接收等待时间计数。 *
静态 uint16缓冲头标志= 0;/*接收头数据结束标志。 *

while (blocksize!= 0U)

if ((SPI->FLG & 0x000000FFU)!= 0U)/*出错。*/

中断;

TX_Data =* srcbuff;

SPI->DAT1 =(SPI->DAT1 & 0xFFFF0000U)|((UINT32) Tx_Data);

srcbuff +;

while ((SPI->FLG & 0x00000100U)!= 0x00000100U)

RecvCnt++;
// if (RecvCnt >= 500)
//{
//中断;
//}//lugh
}/*等待*/

*缓冲区=(uint16)(SPI->BUF & 0xFFFFFFU);
if ((blocksize =20)&&(* destbuff ==0xAAAA))//lugh

BufferHeadFlag = 1;

if (缓冲头标志= 1)

减持器++;

块大小----

BufferHeadFlag = 0;

返回(SPI->FLG & 0xFFU);

从属方:

void _InitSpi3 (spiBASE-t * SpiInfo)

/*@b 初始化@b SPI3 */
/**使 SPI 退出复位*/
SpiInfo->GCR0 = 1U;

/** SPI2主控模式和时钟配置*/
SpiInfo->GCR1 =(0 << 1)/* CLOKMOD *//lugh
| 0;/*从器件*/

/** SPI3使能引脚配置*/
// spiREG3->ENAHIGHZ = 0;//启用 HIGHZ *//lugh 测试

/**-延迟*/
SpiInfo->Delay =(4 << 24)/* C2TDELAY */
|(4 << 16)/* T2CDELAY */
|(0 << 8)/* T2EDELAY */
| 0;// C2EDELAY */

/**-数据格式0 */
SpiInfo->FMT0 =(63 <<24)/* wdelay */
|(0 << 23)/*奇偶极性*/
|(0 << 22)/*奇偶校验使能*/
|(0 << 21)//等待启用*/
|(0 < 20)/*换向*/
|(0 < 17)/*时钟极性*/
|(0 < 16)/*时钟相位*/
//|(79 << 8)/*波特率预分频、1M Hz */
|(7 << 8)/*波特率预分频、10M Hz */
|16;/*数据字长度*/

/**-设置中断级别*/
SpiInfo->LVL =(0 << 9)/* TXINT */
|(0 < 8)/* RXINT */
|(0 << 6)/* OVRNINT */
|(0 << 4)/* BITERR */
|(0 < 3)/* DESYNC */
|(0 << 2)/* PARERR */
|(0 << 1)/*超时*/
|(0);/* DLENERR */

/**-清除所有挂起的中断*/
SpiInfo->FLG = 0xFFFFFFU;

/**-启用中断*/
SpiInfo->INT0 =(0 << 9)/* TXINT */
|(0 < 8)/* RXINT */
|(0 << 6)/* OVRNINT */
|(0 << 4)/* BITERR */
|(0 < 3)/* DESYNC */
|(0 << 2)/* PARERR */
|(0 << 1)/*超时*/
|(0);/* DLENERR */

/**@b 初始化@b SPI3 @b 端口*/

/**- SPI3端口输出值*/
SpiInfo->PC3 = 1/* SCS[0]*/
|(0 < 8)/* ENA */
|(0 << 9)/* CLK */
|(0 < 10)/* SIMO */
|(0 < 11);/* SOMI */

/**- SPI3端口方向*/
SpiInfo->PC1 = 1/* SCS[0]*/
|(0 < 8)/* ENA */
|(0 < 9)/* CLK *//lugh
|(0 < 10)/* SIMO */
|(1 << 11);/* SOMI */

/**- SPI3端口开漏使能*/
SpiInfo->PC6 = 0 /* SCS[0]*/
|(0 < 8)/* ENA */
|(0 << 9)/* CLK */
|(0 < 10)/* SIMO */
|(0 < 11);/* SOMI */

/**- SPI3端口上拉/下拉选择*/
SpiInfo->PC8 = 1/* SCS[0]*/
|(1 << 8)/* ENA */
|(1 << 9)/* CLK */
|(1 << 10)/* SIMO */
|(1 << 11);/* SOMI */

/**- SPI3端口上拉/下拉使能*/
SpiInfo->PC7 = 0 /* SCS[0]*/
|(0 < 8)/* ENA */
|(0 << 9)/* CLK */
|(0 < 10)/* SIMO */
|(0 < 11);/* SOMI */

/* SPI2将所有引脚设置为功能*/
SpiInfo->PC0 = 0 /* SCS[0]*//lugh
|(0 < 8)/* ENA *//lugh
|(1 << 9)/* CLK */
|(1 << 10)/* SIMO */
|(1 << 11);/* SOMI */

/**-初始化 TX 和 RX 数据缓冲区状态*/
G_spiPacket_t[0].TX_DATA_STATUS = SPI_READY;
G_spiPacket_t[0].Rx_DATA_STATUS = SPI_READY;

/*用于 EM 配置的 EmbDataRegCfg。 *
EMDataRegCfg.CSNR = 0;
EMDataRegCfg.CS_HOLD = 0;
EMDataRegCfg.DFSEL = SPI_FMT_0;
EMDataRegCfg.WDEL = 0;

/**-最后启动 SPI3 */
SpiInfo->GCR1 |=(uint32)((uint32) 1U <<24U);/* SPI3启用*/

UINT32 SPI_TransmitAndReceiveData (spiBASE-t * SPI、UINT32块大小、
uint16 * srcbuff、uint16 * destbuff)

静态 uint16 Tx_Data;
uint16 RecvCnt=0;/*接收等待时间计数。 *
静态 uint16缓冲头标志= 0;/*接收头数据结束标志。 *

while (blocksize!= 0U)

if ((SPI->FLG & 0x000000FFU)!= 0U)/*出错。*/

中断;

TX_Data =* srcbuff;

SPI->DAT1 =(SPI->DAT1 & 0xFFFF0000U)|((UINT32) Tx_Data);

srcbuff +;

while ((SPI->FLG & 0x00000100U)!= 0x00000100U)

RecvCnt++;
if (RecvCnt >= 500)

中断;

}/*等待*/

*缓冲区=(uint16)(SPI->BUF & 0xFFFFFFU);
if ((blocksize =20)&&(* destbuff ==0xAAAA))

BufferHeadFlag = 1;

if (缓冲头标志= 1)

减持器++;

块大小----

BufferHeadFlag = 0;

返回(SPI->FLG & 0xFFU);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将此主题移至 Hercules 论坛。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Arvin、

    您在之前的描述中说过您正在使用 HET 中断来触发发送/接收、对吧? 我在您提供的示例代码中看不到这一点。 是否在 HET 中断内调用 SPI_TransmitReceiveData 函数? 鉴于代码似乎每次发送1个字节、背靠背、直到接收到20个字节、如何控制第二个、第三个和后续字节的传输? 也就是说、在从器件读取数据之前、我看不到使用任何 CS 或 ENA 引脚来保持从器件发送的状态。 如果不打算使用任何类型的选通引脚、则需要在字节之间提供一定的延迟、以确保从机有足够的时间重新加载移位寄存器并在主机发起下一次传输之前读出接收到的字节。 一般来说、传输之间需要大约8个 VCLK 周期。