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.

[参考译文] TMS320F28379D:SPI

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/853292/tms320f28379d-spi

器件型号:TMS320F28379D

大家好!

我对 TMS320F28379D 的 SPI 设置有一些疑问。

我尝试使用 DSP 作为 SPI 主器件向名为 IVQ3005器件的从器件写入数据、但无法从从从器件获取正确的波形输出、从器件似乎未接收任何数据。

1.从器件仅使用 SPI_CLK、 SPI_MOSI 和 SPI_Chipselect 导线,因此我将 DSP SPI-A 设置为三线模式。那么,有关的 GPIO 16~GPIO 19设置如何?我尝试如下配置它们,并在模式下使用函数 InitSpia()初始化 SPIA:每字符8位,禁用环回,禁用 FIFO,三线启用:

void InitSpiaGpio()
{
EALLOW;

//
//为所选引脚启用内部上拉
//
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;//启用 GPIO16上的上拉电阻(SPISIMOA)
// GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0;//启用 GPIO5上的上拉电阻(SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;//启用 GPIO17上的上拉电阻(SPISOMIA)
// GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;//启用 GPIO3上的上拉电阻(SPISOMIA)
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;//启用 GPIO18上的上拉电
阻(SPICLKA)// GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;//启用 GPIO19上的上拉电阻(SPISTEA)

//
//仅将所选引脚的限定条件设置为异步
//
//这将为所选引脚选择异步(无限定条件)。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3;//异步输入 GPIO16 (SPISIMOA)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 3;//异步输入 GPIO5 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;//异步输入 GPIO17 (SPISOMIA)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3;//异步输入 GPIO3 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;//异步输入 GPIO18 (SPICLKA)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;//异步输入 GPIO19 (SPISTEA)

//
//使用 GPIO 寄存器配置 SPI-A 引脚
//
//这指定哪些可能的 GPIO 引脚将是 SPI 功能
//引脚。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;//将 GPIO16配置为 SPISIMOA
// GpioCtrlRegs.GPAMUX1.bit.GPIO5=2;//将 GPIO5配置为 SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;//将 GPIO17配置为 SPISOMIA
// GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 2;//将 GPIO3配置为 SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18=1;//将 GPIO18配置为 SPICLKA
// GpioCtrlRegs.GPAMUX2.bit.GPIO19=1;//将 GPIO19配置为 SPISTEA

EDIS;
} 
void InitSpia (void)
{
//初始化 SPI-A

//在配置更改之前将 RESET 设置为低电平
//时钟极性(0 =上升、1 =下降)
// 16位字符
//启用环回
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;
SpiaRegs.SPICCR.bit.SPICHAR =(8-1);//(16-1)
SpiaRegs.SPICCR.bit.SPILBK = 0;//1;环回禁用(0)

//启用主设备(0 =从设备,1 =主设备)
//启用传输(TALK)
//时钟相位(0 =正常、1 =延迟)
//禁用 SPI 中断
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 1;//0
SpiaRegs.SPICTL.bit.SPIINTENA=0;

//设置波特率
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI1_BRR;

//设置空闲位
//在断点上停止不会停止 SPI
SpiaRegs.SPIPRI.bit.FREE = 1;

SpiaRegs.SPIPRI.bit.TRIWIRE = 1;//SPI 3线模式启用
SpiaRegs.SPIFFTX.bit.SPIFFENA=0;//禁用 FIFO

//解除 SPI 复位
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
} 

我的代码中是否有任何错误?

第二个问题是向 TXBUF 写入数据的操作是否意味着主器件将数据发送到从器件?以下代码能否通过 MOSI 实现向从器件发送 TxData 的功能?

uint8_t REF_SPI_ReadWriteByte (uint8_t TxData)
{
uint8_t dummy = 0;

//等待前一字符移位的补码
while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG = 1){}

SpiaRegs.SPICTL.bit.TALK = 1;//启用发送路径
SpiaRegs.SPITXBUF = TxData;//主设备发送数据

IF (SPIA_FIFO)
while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}//等待数据接收--FIFO 模式
其他
while (SpiaRegs.SPISTS.bit.INT_flag!= 1){//非 FIFO 模式


dummy = SpiaRegs.SPIRXBUF;//从自身清除垃圾数据 bc it Rx 相同的数据 TX
返回虚拟;

} 

最后一个问题是 、是否有办法查看 SPI 是否正常工作?我尝试添加 GpioDataRegs.GPADAT.bit.GPIO18 (已配置为 SPICLKA) 在 CCS 调试期间观察变量、但似乎值从未改变、即使在主器件转至发送数据期间也是如此。这是否意味着 SPI 不 能正常工作?如何解决此问题?

非常感谢。



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

    您的 GPIO 配置看起来不错。 您是否曾尝试将示波器或逻辑分析仪连接到 SPI 信号以确认输出符合预期?

    2.是的、假设 SPI 被正确启用、写入 TXBUF 将触发一个传输。 我确实看到了一个代码问题-当你的字符小于16时、你需要在 TXBUF 中保留对齐数据。 在您的情况下、这意味着将 TxData 向左移动8位。

    我认为观看 GPIO18不会给您带来太多的影响。 如果您可以访问设备、按照我在1中的建议执行操作将使您更好地了解 SPI 的工作原理。

    惠特尼