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 设置有一些疑问。
我尝试使用 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 的工作原理。
惠特尼