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:接收缓冲器正在读取通过 SDI 发送发出的值

Guru**** 2585275 points
Other Parts Discussed in Thread: TMS320F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1223512/tms320f28379d-receive-buffer-is-reading-value-sent-out-via-sdi-transmit

器件型号:TMS320F28379D

您好!

我在 使用 TMS320F28379D MCU 和  AD4681 ADC 的定制电路板上遇到问题。 我正在尝试 在切换 CS 线路时读取从 ADC 发出的数据、但接收缓冲区正在读取 SDI 虚拟指令、我正使用该指令来生成将数据推出所需的时钟信号。  

我已检查线路之间的连接性、但未检测到两者之间的短路。 我可以使用逻辑探头并验证时钟信号、SDI 和 SDO 数据是否符合预期。 SDI 与我的输出命令匹配、时钟会干净地生成16位、SDO 返回有效数据、但接收缓冲区看起来不是 SDO 的值。 在传输指令或虚拟命令时、我的接收缓冲区将是我使用的任何值。

下面是一些 软件的剪裁 ,我将赞赏 健全的检查。

//
// spia_xmit -通过 SPI 传输值
//
void spia_xmit (Uint16A)

SpiaRegs.SPITXBUF = A;
}


//
// InitSpiaGpio -初始化 SPIA GPIO
//
void InitSpiaGpio()

//初始化 SPI-A

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

//启用主器件(0 =从器件、1 =主器件)
//启用传输(通话)
//时钟相位(0 =正常、1 =延迟)
//禁用 SPI 中断
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpiaRegs.SPICTL.bit.talk = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
SpiaRegs.SPICTL.bit.SPIINTENA = 0;


EALLOW;

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

//
//将所选引脚的鉴定设置为仅异步
//
//这将为所选的引脚选择异步(无限定条件)。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3;//异步输入 GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;//异步输入 GPIO17 (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.GPAMUX2.bit.GPIO17 = 1;//将 GPIO17配置为 SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;//将 GPIO18配置为 SPICLKA
// GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;//将 GPIO19配置为 SPISTEA

//将 GPIO19配置为输出
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0x00;
GpioCtrlRegs.GPADIR.bit.GPIO19 = 0xFF;
GpioDataRegs.GPASET.bit.GPIO19 = 1;

EDIS;
}

主代码:

...

GpioDataRegs.GPACLEAR.bit.GPIO19 = 0xFF;
delay_loop();

adcCMD = 0b0000000000000001;
SPIA_xmit (adcCMD);
delay_loop();

while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){
RDATA = SpiaRegs.SPIRXBUF;
}

GpioDataRegs.GPASET.bit.GPIO19 = 1;
delay_loop();

...

如果您有任何反馈或问题可以帮助您彻底解决问题、那么我们将不胜感激。 谢谢你。

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

    您好、Eric、

    [报价 userid=501983" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1223512/tms320f28379d-receive-buffer-is-reading-value-sent-out-via-sdi-transmit "] 当我切换 CS 线路时,我试图读取从 ADC 发出的数据,但接收缓冲区正在读取 SDI 虚拟指令,我正使用此指令来生成将数据推出所需的时钟信号。  [/报价]

    您正在 GPIO19上手动切换 CS 线路、对吗?

    简单来说、这是指 F28379D 器件上的接收缓冲区具有您发送的数据(虚拟数据)?  

    是这样吗?

    此致、

    Marlyn

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

    是的、目前我使用 GPIO19作为手动 CS 切换。

    是的、 在发送命令时、SpiaRegs.SPIRXBUF 会加载我发出的确切值、而不管 SDO 上的数据是从 ADC 发回的

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

    您好、Eric、

    我注意到您的代码中启用了回送:

    Unknown 说:
    SpiaRegs.SPICCR.bit.SPILBK = 1;

    当启用此功能时、 SIMO/SOMI 线在内部进行连接。 您能否将其设置为0、看看它是否能修复您的问题?

    此致、

    Marlyn