各位专家:
我们的客户 在 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