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.

[参考译文] CCS/TMS320F28379D:如何移位 TXBUF 寄存器、以便使用 SPI 发送2个以上的字符

Guru**** 2540720 points
Other Parts Discussed in Thread: CC3200

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/623215/ccs-tms320f28379d-how-i-can-shift-txbuf-register-for-sending-more-than-2-chars-using-spi

器件型号:TMS320F28379D
Thread 中讨论的其他器件:CC3200

工具/软件:Code Composer Studio

您好!

我发布了一个有关使用 F28379D 通过 SPI 发送2个以上字符的问题、因此、我检查并修改所有寄存器的每个位、以了解我可能出错的位置。 但之后、我可以告诉您设置是正确的。 我的故障是在 Code Sketch 中、事实上我可以发送2个字符、但在这2个字符之后移动 TXBUFF 确实有问题。 如何在 sketch 中写入以等待 BUFFULL_FLAG 已满? 我需要等到这个缓冲区完全充满了我的字符。

有关用于 TI Sketch 的 C++语言的另一个问题。 在另一篇文章中,我看到了以下命令: SpiaRegs.SPITXBUF =sdata[0]| sdata[1]<<8;

当  sdata[0]='A';和  sdata[1]='B';  

它可以工作、但仅适用于2个字符。

我尝试使用 int i=0;SpiaRegs.SPITXBUF=sdata[i]和递增 i++来创建一个 for cycle、 但我是如何说问题在班次中、结果是唯一发送的最后一个字符的。

我的目标是发送一串字符,例如在 CC3200上响应:“这是 F28379D 从应用程序” 或发送 ADC 样本。

任何帮助都将不胜感激!! 谢谢、Alessio

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

    您对 BUFFULL_FLAG 所做操作的描述似乎与该标志的实际功能不匹配。 当一个字符被写入发送缓冲区时、该标志应该被置位。 在向缓冲区写入字符之前、您更有可能希望等待 BUFFULL_FLAG 被清除。 您可以使用 while (SpiaRegs.SPISTS.bit.BUFFULL_flag = 1)等方法等待 BUFFULL_FLAG 清除;

    SpiaRegs.SPITXBUF 是一个16位寄存器、因此寄存器中一次只有两个8位字的空间。 如果您希望像这样一次发送两个数据、则循环可以递增2、写入 sdata[i]|(sdata[i+1]<<8)、并等待 BUFFULL_FLAG 清除、然后再写入另外两个字符。

    或者、如果您希望一次发送一个字符、您可以将字符大小更改为8 (SPICCR 寄存器中的 SPICHAR 字段)、并将 sdata[i][<8写入 TXBUF 寄存器。 请注意、当字符大小小于16时、必须将数据左移。

    惠特尼

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

     尊敬的惠特尼:

    感谢您的替换和关注!

    我 听从了你的建议,我可以看到更好的改进! 事实上、从器件发送的字符串有一点拼接、我将对此进行解释。  

    从机消息为"Tensone、65222"、主机接收如下消息:  

    您可以看到消息是正确的、但数据包之间有一个0位、然后继续传输。 如果此时 x(0)= 111,则下一个步骤 x(2)= 111,当我尝试使用一个不带0位的固定消息时,与此类似(主消息):

    这里是一个包含您的建议的新草图  

    //######################################################################################################################
    //
    ////文件:example_2837xDSpi_FFDLB.c
    //
    //标题:SPI 数字环回程序。
    //
    //! addtogroup cpu01_example_list
    //! 

    SPI 数字回路(SPI_LOOP)

    //! //! 该程序使用外设的内部回路测试模式。 //! 除引导模式引脚配置外、无其他硬件配置 //! 要求。 不使用中断。 //! //! 发送数据流、然后与接收到的数据流进行比较。 //! 发送的数据如下所示:\n //! 0000 0001 0002 0003 0004 0005 0006 0007… FFFE FFFF \n //! 这种模式会一直重复。 //! //! b 监视\b 变量\n //! -\n sdata -已发送数据 //! -\b RDATA -接收到的数据 //! // //########################################################################################################################## //$TI 发行版:F2837xD 支持库 V200 $// $发行 日期:星期二6月21日13:00:02 CDT 2016 $// 版权所有:版权所有(C) 2013-2016德州仪器(TI)公司-// http://www.ti.com/ 保留所有权利$ //############################################################################################################ // //包含的文件 // #include "F28x_Project.h" #include "stdio.h" // 函数原型 // //基于 TMS320F28335 SPI 示例的代码 //器件头文件和示例包括此 文件中找到的函数的文件//原型语句。 void FIFO_init (void); void SPI_init (void); void SPI_xmit (uint16 a); void delay_loop (void); uint16 temp=65222; uint16 Txbuffer1; uint16 Txbuffer2; //全局变量(用于读取寄存器) unsigned char RDATA; unsigned char rdata1; unsigned char rdata2; unsigned char sdata[16]; void delay_loop () { 长 I; 对于(i = 0;i < 15000;i++){} void main (void){ //初始化系统控制: //PLL、看门狗、启用外设时钟 //此示例函数可在 DSP2833x_sysctrl.c 文件中找到。 InitSysCtrl(); //Initialize GPIO: //this 示例函数位于 DSP2833x_GPIO.c 文件中, //说明如何将 GPIO 设置为其默认状态。 //仅为 SPI-A 功能设置 GP I/O //此函数可在 DSP2833x_SPI.c InitSpiaGpio()中找到; //清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 DINT; //将 PIE 控制寄存器初始化为默认状态。 //默认状态是禁用所有 PIE 中断并 清除标志//。 //此函数位于 DSP2833x_PIECTRL.c 文件中。 InitPieCtrl(); //禁用 CPU 中断并清除所有 CPU 中断标志: IER = 0x0000; IFR = 0x0000; //使用指向 shell 中断 //服务例程(ISR)的指针初始化 PIE 矢量表。 //这将填充整个表,即使在 本示例中未使用中断//也是如此。 这对于调试很有用。 //可以在 DSP2833x_DefaultIsr.c 中找到 shell ISR 例程 //此函数位于 DSP2833x_PieVect.c 中 InitPieVectTable(); FIFO_init ();//初始化 SPI FIFO SPI_init (); //初始化 SPI //用户特定代码: //此示例中不使用中断。 for (;;) { //等待数据被接收 while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){} rdata1 = SpiaRegs.SPIRXBUF & 0xFF; rdata2 =(SpiaRegs.SPIRXBUF 和0xFF00)>> 8; //加载传输缓冲器 int i=0; //for (i=0;i<4;i++){ /*char 测试; test=sdata[i]<<8;*/ while (i<16){ // //发送数据 // SPI_xmit (sdata); // //等待数据被接收 // while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){} // //检查已发送的数据 // RDATA = SpiaRegs.SPIRXBUF; uint16_t 长度= sprintf (sdata、"Tensione、%u"、temp); // sdata[i] Txbuffer1= sdata[i]; //|(sdata[i+1]<<8) //Txbuffer2= sdata[i+1]; i++; if (i==16){i=0;} }} //SpiaRegs.SPITXBUF =sdata[1]|sdata[2]|sdata[3]| sdata[4]; /* SpiaRegs.SPITXBUF= sdata[2]; SpiaRegs.SPITXBUF= sdata[3]; SpiaRegs.SPITXBUF= sdata[4]; //} sdata[0]='a'; sdata[1]='B'; sdata[2]='C'; /*报告传感器数据*/ //字符生成器 //if (sdata[0]=67){sdata[0]='D';} //else{sdata[0]='C';} //if (sdata[1]=68){sdata[1]='C';} //else{sdata[1]='D';} } void SPI_xmit (uint16 a) { SpiaRegs.SPITXBUF = Txbuffer1 |(Txbuffer2<8); } void SPI_init (){SpiaRegs.SPICCR.bit.SPISWRESET = 0;// trasiaRegs.SPISTS.bit.overl_flag = 0;spsi Spierta già con SPICCR.bit.SPISRESET = 0;s/setretario.prise.tis/resetario.prise.tise.ts/resetario.prisfet = 1 Si resetta con SPISWRESET da leggere:0 transmit buffer non è pio=1 è pioeno // SpiaRegs.SPIBRR=在量化至 essendo 从模式下的非 va setto non ha nessun effetto SpiaRegs.SPICTL.bit.master_slave_slave= 0;//从 SpiaRegs.SPICCR.SPICHs = 0;/TRICOL.TICK= 0;= 0;=启用 //数据在下降沿输出、在上升沿输入 SpiaRegs.SPICCR.bit.SPICHAR =(16-1);//16位 altimeti 0x7 per 7 bit SpiaRegs.SPICTL.bit.CLK_PHASE = 0; SpiaRegs.SPICCR.bit.SPILBK= 0;/SPICRBIT.ST_POL= 0;/SPBIST.SPICL= 1;/SPBIST.SPBIT.ST_POST.SPICS=0XT.ST_POST.SPICS=0XT.ST_POL= 0;/SPBIST.SPBIST_POST.SPIST.SPICRIST.SPISTS.SPIST.ST_POL= 0;/SPBIST_POST.SPBIST_ //清除此缓冲区(Basta leggere RXBUFF) SpiaRegs.SPICTL.bit.OVERRUNINTENA=1;//启用接收器溢出中断 SpiaRegs.SPICTL.bit.SPIINTENA=0;//启用中断。 SpiaRegs.SPICCR.bit.SPISWRESET = 1;//Rilascio 复位 SpiaRegs.SPIPRI.bit.FREE = 1; // CpuSysRegs.PCLKCR8.bit.SPI_A = 1;A CHE 服务?! } void FIFO_init (){ /******* SPI FIFO TX 缓冲器 / SpiaRegs.SPIFFTX.bit.SPIRST=0;//inizializza RESET SPI SpiaRegs.SPIFFTX.bit.SPIFFENA=1;//启用 SPI FIFO 增强功能。 SpiaRegs.SPIFFTX.bit.TXFIFO= 0;//inizizza 复位 FIFO // SpiaRegs.SPIFFTX.bit.TXFFST=(读取缓冲区) SpiaRegs.SPIFFTX.bit.TXFFINTCLR= 1;//清除 SPIFFTX SpiaRegs.SPIFFTXIFIFIF.bit.TXIFIFIFIFIFIFIFIFIFIFIFFRENA= 1;将基于中断启用 TXIFTXIFTL.TXIF.TXIFIFIFIFIFIFIFIFIFIFIFIFIFIFIFIFIFIFIFIF. SpiaRegs.SPIFFTX.bit.TXFFIL=7; SpiaRegs.SPIFFTX.bit.TXFIFO=1; SpiaRegs.SPIFFTX.bit.SPIRST= 1; /*** SPI FIFO RX 缓冲器 ////SpiaRegs.SPIFFRX.bit.RXFFOVf= 只读 SpiaRegs.SPIFFRX.bit.RXFFOVFCLR= 1;//Clear SPIFFRX SpiaRegs.SPIFFRX.bit.RXFPiFIFORESET= 0;RXIFFRA.RXIFFRX.BIT.BIF= 1;将启用 RXIFFRIFFRX.BIT.RXIFFRIFFRL= 1中断/ RXIFFRIFFRIFFRIFORESET= 1;RXIFFRIFFRIFFRIFT.BIT.TX.BIL SpiaRegs.SPIFFRX.bit.RXFFIL= 16;//当 RX 缓冲 区 SpiaRegs.SPIFFRX.bit.RXFIFORESET= 1; /*****中有16个字时生成 RX FIFO 交叉请求 SPI FIFO 控制寄存器********* / SpiaRegs.SPIFFCT.bit.TXDLY= 0;// TX FIFO 缓冲区中的下一个字被传输到前一个字 /***** SPI 优先级控制寄存器******* / SpiaRegs.SPIPRI.bit.STEINV=0;// SPISTEn 为低电平有效(正常) }

    我的问题至少是:

    是否如您所说、此命令用于正确发送?

    SpiaRegs.SPITXBUF = Txbuffer1 |(Txbuffer2<<8); 

    当主消息 IN 出现数据包移位、从而导致图像不稳定时、我会出现什么问题?

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

    您好、Alessio、

    在您共享的代码中、您有一条将值分配给 Txbuffer2的线被注释掉。 当您取消注释写入 Txbuffer2的行并将 i++更改为 i+=2时、它是否仍然不起作用?

    惠特尼