【发布时间】:2020-04-12 22:20:46
【问题描述】:
我正在通过 PIC16f877A 和 TFT smart lcd(中国品牌)开始一个项目。我设计了一个代码来连接 PIC 和 TFT 来发送数据。 TFT 的协议设计为一次发送 8 位,这是在程序中准备好的。最初的结果很好,但有一个小错误。 传输的数据在传输过程中丢失了位,我找不到这个问题的答案。 例如,我应该传输 0x000290FA,但传输的代码变成了 0x000200FA。
这是项目的代码。
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef unsigned short INT16U;
typedef unsigned long INT32U;
BOOLEAN HMT_WriteVPN32(INT32U Addr,INT32U Data);
void main() {
UART1_Init(115200); // Initialize UART module at 115200 bps
Delay_ms(100); // Wait for UART module to stabilize
HMT_WriteVPN32(0x00020000,0x000290FA);
delay_ms (500);
HMT_WriteVPN32(0x00020004,0x0008AD6D);
}
BOOLEAN HMT_WriteVPN32(INT32U Addr,INT32U Data)
{
INT16U Hdata = 0, Ldata = 0;
INT16U AddrH = 0, AddrL =0 ;
INT16U AddrHH = 0, AddrHL = 0, AddrLH = 0, AddrLL = 0;
INT16U HHdata = 0, HLdata = 0, LHdata = 0, LLdata = 0;
if((Addr < 0x00020000) || (Addr > 0x0002FFFF))
{
return (FALSE);
}
AddrH = Addr>>16; // Take high 16 data
AddrL = Addr; // Lower 16 data
AddrHH = AddrH >> 8;
AddrHL = AddrH;
AddrLH = AddrL >> 8;
AddrLL = AddrL;
Hdata = Data >> 16; // Take the 32-bit high byte
Ldata = Data ; // Take the 32-bit low byte
HHdata =Hdata >> 6;
HLdata = Hdata ;
LHdata = Ldata >> 6;
LLdata = Ldata ;
SendHead(); // Send frame header
UART1_Write(0x44); // send command
UART1_Write(AddrHH);
UART1_Write(AddrHL);
UART1_Write(AddrLH);
UART1_Write(AddrLL);
UART1_Write(HHdata);
UART1_Write(HLdata);
UART1_Write(LHdata);
UART1_Write(LLdata);
SendTail(); // Send end of frame
return (TRUE);
}
【问题讨论】:
-
UART1_Write()(或您的程序)如何等待前一个字节的传输完成,即传输移位寄存器为空?变量 AddrHH、AddrHL、... LLdata 应声明为 INT8U 而不是 INT16U。另一个错误:HHdata 和 LHdata 的移位操作似乎不正确。
-
这是重点。我不知道如何让程序等待传输完成。这是 MikroC 中的一个库,我直接使用它我不好,我已将 HHdata 和 LHdata 的移位修改为 8 位移位。但还是没有结果
-
为了简化调试,您可以尝试在对 UART1_Write 的调用中临时放入常量,看看是否收到了预期的结果。
-
@Aymanhussien -- 您正在使用的库中是否提供此例程:UARTx_Tx_Idle()?
-
UART_Tx_Idle() 可用。但是使用它并没有给出任何结果。我对代码做了一些修改,代码直接生效了。我将 (unsigned short) 替换为 (unsigned long) 或 (unsigned int)