您好!
我在 使用 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();
...
如果您有任何反馈或问题可以帮助您彻底解决问题、那么我们将不胜感激。 谢谢你。