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:代码

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1102088/tms320f28379d-codes

器件型号:TMS320F28379D

各位专家:

我们的客户 在 TMS320F28379D conrolCard 和 Nextion 显示屏之间的串行通信中遇到问题、他基于 sci_ex2_loopback _interrupts 示例开始、可以向 nexion 显示屏发送数据、但无法从中读取数据。
下面是他从显示屏读取信息的代码。 如果他使用 Arduino 卡发送命令、则代码正常工作、但它不会尝试从 Nexion 显示屏读取串行通信命令。
如果您有任何可以帮助 我们客户的想法、请提前感谢您。


//
/*TM320F28379D SCIA 与 Nextion*/
//
//
//********* 包含的文件*********
//
#include
#include
#include

#include "F28x_Project.h"
#include
#include

#include
#include
#include

//
//******** 定义了'*********
#define Blinky_LED_GPIO 31.
#define buffer_size 128
//#define DEVICE_LSPCLK_FREQ (DEVICE_SYSCLK_FREQ / 4)
//******** 全局图标*******
uint16_t 计数器= 0;
unsigned char *msg;
uint16_t rec=0;
uint16_t RDATA_pointA=0;
unsigned char rdataA[buffer_size];
char Rx_array[128];
//********* 原型********
void UART_GPIO_init ();
void SCI_A_init ();
void config_SCIA();
void initSCIAFIFO();
_interrupt void sciaTxISR (void);
_interrupt void sciaRxISR (void);


//*********
//

void main (void)


//
InitSysCtrl();
//

InitGpio();
GPIO_SetupPinMux (Blinky_LED_GPIO、GPIO_MUX_CPU1、0);
GPIO_SetupPinOptions (Blinky_LED_GPIO、GPIO_output、GPIO_PushPull);
//
device_init();
DEVICE_initGPIO();
//UART_GPIO_init ();
//config_SCIA();
//SCI_A_init ();
//
/******* 环路闪烁 LED 测试*********
//
int i;
for (i=0;i<10;i++)

//
//打开 LED
//
GPIO_WritePin (Blinky_LED_GPIO、0);
//
//延迟一位。
//
DELAY_US (1000*100);
//
//关闭 LED
//
GPIO_WritePin (Blinky_LED_GPIO、1);

//
//延迟一位。
//
DELAY_US (1000*100);


GPIO_WritePin (Blinky_LED_GPIO、0);
//
//******** SCI 中断********
Dint;

UART_GPIO_init ();
CONFIG_SCIA();
sci_a_init();
//
//初始化中断控制器和矢量表。
//
interrupt_initModule();
interrupt_initVectorTable();
IER = 0x0000;
IFR = 0x0000;

//
//将 ISR 映射到唤醒中断。
//
interrupt_register (INT_SCIA_TX、sciaTxISR);
interrupt_register (INT_SCIA_RX、sciaRxISR);

//
//初始化 SCIA 及其 FIFO。
//
// initSCIAFIFO();
// SCI_performSoftwareReset (SCIA_BASE);
// msg ="\r\n\nHello World!\n";
// SCI_writeCharArray (SCIA_BASE,(uint16_t*) msg,17);
// msg ="\r\n 您将输入一个字符,DSP 将回显它!\r\n\r\n;
// SCI_writeCharArray (SCIA_BASE、(uint16_t*) msg、62);

//
//在启用 SCI 中断之前将其清除。
//
SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT);

//
//在 PIE 中启用中断:组9中断1和2。
//
INTERRUPT_ENABLE (INT_SCIA_RX);
INTERRUPT_ENABLE (INT_SCIA_TX);
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);

//
//启用全局中断。
//
EINT;
ERTM;
//

//********* 中断循环*********
while (1){;}
//

}//end main
//

//********
void UART_GPIO_init (){

//SCIA -> SCI0引脚多路复用
// GPIO_setPinConfig (GPIO_43_SCIRXDA);
// GPIO_setPinConfig (GPIO_42_SCITXDA);

GPIO_SetupPinMux (28、GPIO_MUX_CPU1、1);
GPIO_SetupPinOptions (28、GPIO_INPUT、GPIO_PushPull);//GPIO_PushPull 至 GPIO_PULLUP
GPIO_SetupPinMux (29、GPIO_MUX_CPU1、1);
GPIO_SetupPinOptions (29、GPIO_OUTPUT、GPIO_异 步);//GPIO_异 步至 GPIO_PULLUP

// GPIO_setPinConfig (GPIO_28_SCIRXDA);// DEVICE_GPIO_CFG_SCIRXDA 更改为 GPIO_28_SCIRXDA
// GPIO_setPinConfig (GPIO_29_SCITXDA);//器件 GPIO_CFG_SCITXDA 更改为 GPIO_29_SCITXDA

//*********
void SCI_A_init (){

SCI_performSoftwareReset (SCIA_BASE);

//
//为回声配置 SCIA。
//
SCI_setConfig (SCIA_BASE、DEVICE_LSPCLK_FREQ、9600、(SCI_CONFIG_WLEN_8 |SCI_CONFIG_STOP_ONE |SCI_CONFIG_PAR_NONE));
SCI_resetChannels (SCIA_BASE);
SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT);
SCI_enableModule (SCIA_BASE);
SCI_performSoftwareReset (SCIA_BASE);

//
//启用 TXRDY 和 RXRDY 中断。
//
SCI_enableInterrupt (SCIA_BASE、SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT);

#ifdef 自动波特率
//
//执行自动波特率锁定。
// SCI 要求用'A'或'A'来锁定波特率。
//
SCI_lockAutobaud (SCIA_BASE);
#endif

//*********
空 CONFIG_SCIA()

针对 SCI Rx 引脚的//配置。
//
GPIO_setMasterCore (DEVICE_GPIO_PIN_SCIRXDA、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_28_SCIRXDA);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_SCIRXDA、GPIO_DIR_MODE_IN);
GPIO_setPadConfig (DEVICE_GPIO_PIN_SCIRXDA、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (DEVICE_GPIO_PIN_SCIRXDA、GPIO_QUAL_异 步);

//
针对 SCI Tx 引脚的//配置。
//
GPIO_setMasterCore (DEVICE_GPIO_PIN_SCITXDA、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_29_SCITXDA);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_SCITXDA、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (DEVICE_GPIO_PIN_SCITXDA、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (DEVICE_GPIO_PIN_SCITXDA、GPIO_QUAL_异 步);

//
//初始化中断控制器和矢量表。
//
interrupt_initModule();
interrupt_initVectorTable();

//
//初始化 SCIA 及其 FIFO。
//
SCI_performSoftwareReset (SCIA_BASE);

//
//为回声配置 SCIA。
//
SCI_setConfig (SCIA_BASE、DEVICE_LSPCLK_FREQ、9600、(SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));
SCI_resetChannels (SCIA_BASE);
SCI_setFIFOInterruptLevel (SCIA_BASE、SCI_FIFO_TX2、SCI_FIFO_RX2);//启用 RX 和 TX FIFO 中断
SCI_resetRxFIFO (SCIA_BASE);
SCI_resetTxFIFO (SCIA_BASE);
SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF | SCI_INT_RXFF);
SCI_enableFIFO (SCIA_BASE);
SCI_enableModule (SCIA_BASE);
SCI_performSoftwareReset (SCIA_BASE);
//

#ifdef 自动波特率
//
//执行自动波特率锁定。
// SCI 要求用'A'或'A'来锁定波特率。
//
SCI_lockAutobaud (SCIA_BASE);
#endif


/********* initscIAFIFO -配置 SCIA FIFO *********
空 initSCIAFIFO()

//
// 8个字符位,1个停止位,无奇偶校验。 波特率为9600。
//
SCI_setConfig (SCIA_BASE、DEVICE_LSPCLK_FREQ、9600、(SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));
SCI_enableModule (SCIA_BASE);
SCI_enableLoopback (SCIA_BASE);
SCI_resetChannels (SCIA_BASE);
SCI_enableFIFO (SCIA_BASE);

//
//启用 RX 和 TX FIFO 中断
//
SCI_enableInterrupt (SCIA_BASE、(SCI_INT_RXFF | SCI_INT_TXFF);
SCI_disableInterrupt (SCIA_BASE、SCI_INT_RXERR);

SCI_setFIFOInterruptLevel (SCIA_BASE、SCI_FIFO_TX2、SCI_FIFO_RX2);
SCI_performSoftwareReset (SCIA_BASE);

SCI_resetTxFIFO (SCIA_BASE);
SCI_resetRxFIFO (SCIA_BASE);

#ifdef 自动波特率
//
//执行自动波特率锁定。
// SCI 要求用'A'或'A'来锁定波特率。
//
SCI_lockAutobaud (SCIA_BASE);
#endif

//********* 中断*********

_interrupt void
sciaTxISR (空)


//
//禁用 TXRDY 中断。
//
SCI_disableInterrupt (SCIA_BASE、SCI_INT_TXRDY);

// msg ="\r\n 输入字符:\0";
// SCI_writeCharArray (SCIA_BASE,(uint16_t*) msg,22);

//
//确认 PIE 中断。
//
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);


//
// sciaRxISR -从 RXBUF 读取字符并将其回显。
//
_interrupt void
sciaRxISR (空)



///**** 发送字符数组
//
rdataA[RDATA_pointA]=SciaRegs.SCIRXBUF.all;
RDATA_pointA++;

if (RDATA_pointA>=buffer_size)
RDATA_pointA=0;

//if (rdataA[RDATA_pointA-1]='\n')
if (rdataA[RDATA_pointA-1]='F')&&(rdataA[RDATA_pointA-2]='F')&&(rdataA[RDATA_pointA-3]='x')&&(rdata[RDATA_pointA]&=rdata6'rdata]&rra=rdata6e4'rdata]&rra=rdata_pointA&rdata='rra2'=[rdata]&rra&rra&rra&rdata='rra&rra&rra&rdata='rra&rra&rtra&rra&rra&rdata='rtra&rra&rtra='rtra&rtra'='=rra&rra&rra&rra&rra&rra&rra&rra&rra&rra&rra&rra&rtra&rtra&rra&rtra&rra&rra&rra&rra&rtra&rra&rtra&rra&rra&rra&

//SCI_writeCharArray (SCIA_BASE、(uint16_t *)"从 DSP 到 Arduino 您发送的内容:\r\n"、sizeof ("从 DSP 到 Arduino 您发送的内容:\r\n");
sci_writeCharArray (scia_base、(uint16_t*)"\r\n"、sizeof ("\r\n");//添加
SCI_writeCharArray (SCIA_BASE、(uint16_t*) rdataA、RDATA_pointA-12);
//memset (rdataA、'\0'、128);
RDATA_pointA=0;

PieCtrlRegs.PIEACK.All=0x100;
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);
//
///********* 发送一个字符
// uint16_t receivedChar;
//
////再次启用 TXRDY 中断。
////
// SCI_enableInterrupt (SCIA_BASE、SCI_INT_TXRDY);
//
////
////从 RXBUF 中读取一个字符。
////
//接收字符= SCI_readCharBlockingNonFIFO (SCIA_BASE);
//
////
////回显字符。
////
///*msg ="您已发送:\0";
// SCI_writeCharArray (SCIA_BASE,(uint16_t*) msg,13);*/
// SCI_writeCharArray (SCIA_BASE、(uint16_t*)"\r\n"、sizeof ("\r\n");//添加
//// if (receivedChar=13) SCI_writeCharArray (SCIA_BASE、(uint16_t*)"\r\n"、sizeof ("\r\n");//添加
// SCI_writeCharBlockingNonFIFO (SCIA_BASE、receivedChar);
//
//
////
////确认 PIE 中断。
////
// Interrupt_clearACKGroup (interrupt_ACK_group9);
//
// counter++;


此致、
Gerald

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

    您好 Gerald、

    [引用 userid="487850" URL"~/support/microcontrols/c2000-microcontrol-group/C2000/f/c2000-microcontrol-forum/1102088/tms320f28379d-codes"]如果他使用 Arduino 卡发送命令,则代码可以正常工作,但他不会尝试从 Nextion 显示屏上读取串行命令通信。

    他们是否探测了 RX 引脚以确保从 Nexion 显示屏发送数据?

    [引用 userid="487850" URL"~/support/microset/C2000-microset-group/C2000/f/C2000-microset-forum/1102088/tms320f28379d-codes"]他可以向显示器发送数据,但无法从中读取数据。

    RX 中断中的计数是否在增加? 如果是、数据是否不正确?

    此致、

    Marlyn

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

    您好、 Marlyn、

    他们是否探测了 RX 引脚以确保从 Nexion 显示屏发送数据?
    是的、客户将 Nextion 显示屏与 Arduino 配合使用、通信正常、他可以读写。 此外、当他将 F28379D controlCARD 与 Arduino 配合使用时、他可以读取和写入、但当他将 Nextion 与 F28379D 卡配合使用时、他可以向显示屏发送命令、但无法从中读取。

    RX 中断中的计数是否在增加? 如果是、数据是否不正确?
    不会、中断计数器不会增加、RX 缓冲区中会出现 NOThings、此外、如果中断通过 RX、则使用 LED 闪烁、但 LED 不会闪烁

    此致、
    Gerald

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

    Gerald、

      Marlyn 目前不在办公室,将在周一回到办公室时作出回应。 感谢您的耐心等待。

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

    您好 Gerald、

    感谢您的回答。

    我看到客户正在禁用 RX 错误中断。 是否可以启用此选项并在 Rx 中断中插入 if 语句以检查是否有任何错误? 这可以让我们更深入地了解为什么没有从 Nextion 显示屏接收到数据。 如果出现错误、让我们检查什么类型的错误(组帧、中断检测等)。  

    此外、在使用 Nextion 显示屏时、RX 路径(硬件方面)是否有任何不同?

    此致、

    Marlyn

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

    您好、 Marlyn、

    关于 RX 错误中断、客户表示将添加并告知我们。
    他还提到 、当他将 DSP 连接到 Arduino 进行读写时、通信良好、他认为 RX 错误中断没有问题。
    此外、Nextion 显示屏在读取和写入方面均可与 Arduino 配合使用。
    Nexion 显示屏的 TX 输出在3V 到5V 之间的另一件事是 F28379D DSP 可以处理此电压电平、还是需要3.3V 到5V 的转换器?

    此致、
    Gerald

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

    您好、 Marlyn、

    我看到客户正在禁用 RX 错误中断。
    请说哪种错误中断? 它是"void error (void)"函数吗?

    此致、
    Gerald

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

    您好 Gerald、

    通过以下行:

    [引用 userid="487850" URL"~/support/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forum/1102088/tms320f28379d-codes/4088537#4088537"]他还提到 、当他将 DSP 连接到引用以进行读写时、他认为 Arduino RX/RX[没有问题]。

    如果它们启用 SCI_INT_RXERR、则只要出现错误、也会发生中断。 当达到 RX 中断时、可以插入一个断点、然后查看 SCIRXST 寄存器。

    [引用 userid="487850" URL"~/support/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forum/1102088/tms320f28379d-codes/4088537#4088537"]另外一件从 Nexion 显示屏输出的 TX 电压介于3V 和5V 之间的事情是 F28379D DSP 可以处理3.3V 或3.3V 电压电平转换器?]

    F28379D 引脚只能处理3.3V 而不能处理5V 电压。 如果 Nextion 的输出为5V、则需要将其向下转换。

    此致、

    Marlyn

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

    您好、 Marlyn、

    有关客户反馈、请参阅以下详细信息:

    "我启用了 SCI_INT_RXERR、并在 Rx 中断中添加了一条 if 语句、以检查_interrupt void 中是否存在错误
    sciaRxISR (void)函数。 此外、将 SCIRXST 寄存器添加到观察表达式窗口中、但我不会得到任何结果。

    //启用 RX 和 TX FIFO 中断
    SCI_enableInterrupt (SCIA_BASE、(SCI_INT_RXFF | SCI_INT_TXFF);
    SCI_enableInterrupt (SCIA_BASE、SCI_INT_RXERR);//启用 SCI_INT_RXERR

    // if 语句添加到__interrupt void sciaRxISR (void)函数中
    IF (SCI_INT_RXERR)

    //error();
    GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1;//在中断后切换一个 LED


    否则、我在 F28379D controlCARD 和 Nexion 显示屏之间使用3.3V 至5V 双向逻辑电平转换器、但同样、我可以向显示屏发送数据、但无法从中读取数据。

    我现在在逻辑分析仪上工作的另一件事是查看显示屏发送的帧、它与 Arduino 发送的帧相同"

    此致、
    Gerald

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

    您好 Gerald、

    感谢您发送客户的反馈。 我很感谢他们实现 Rx 错误中断。  

    [引用 userid="487850" URL"~/support/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forum/1102088/tms320f28379d-codes/4090594#4090594"]另一件事我现在正在逻辑分析仪上工作、以查看显示屏发送的帧、它与 Arduino/quotino"]

    这是可以解决的问题、还是结果显示输出与 Arduino 相同?  

    是否可以提供 Arduino 和显示屏所发送输出的示波器捕获? 此外、F28379D 器件上是否探测了 RX 引脚、以至少确认数据将其传输到引脚上?  

    此致、

    Marlyn

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

    Marlyn

    有关客户反馈、请参阅以下详细信息:

    "
    很抱歉、我不是很清楚、我的意思是"通过显示屏发送帧、它与 Arduino 发送的帧相同"、显示的 Tx 输出与 Arduino 的 Tx 输出相同、但无法正常工作、 我的意思是不能与显示屏配合使用、但它可以与 Arduino 配合使用。

    查找附件 Arduino 和显示屏发送输出的示波器捕获、我从 Arduino 打印"0"、当我按下按钮时、显示屏将在串行上打印"0"。

    我已经探测了 F28379D controlCARD 上的 Rx 引脚、 当我使用 Arduino 时、我可以看到 Rx 引脚上打印的"0"、这是正常现象、因为它可以与 Arduino 配合使用、但当我使用 Display 时、仅在将 Tx 显示屏连接到 DSP 的 Rx 后、探针上就没有显示任何内容、在连接之前、我会看到"0" 已打印,但连接编号之后

    找到显示所有这些内容的附加屏幕。"
    e2e.ti.com/.../CS1034270.zip

    此致、
    Gerald


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

    您好 Gerald、

    电平转换器的输出是否已确认? 这意味着 F28379D 发送的数据是否正确移位、反之亦然? 这是我能想到的唯一表明 F28379D 和显示屏之间存在问题或差异的地方。 请检查电平转换器两侧是否使用示波器。 请注意、TX 和 RX 线路上都需要有一个。  

    此致、

    Marlyn

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

    您好、 Marlyn、

    非常感谢您的支持和帮助、它终于成功了、问题在于 GPIO A 开漏输出寄存器(GPAODR)。
    客户 将此命令添加到 void CONFIG_SCIA()函数:
    GPIO_setPadConfig (DEVICE_GPIO_PIN_SCIRXDA、GPIO_PIN_TYPE_OD);//引脚配置为开漏// 1:开漏输出/0:正常输出/ GPOODR 寄存器 pg:985/spruhm8i.pdf

    此致、
    Gerald