【问题标题】:Bits disappear during UART transmissionUART 传输期间位消失
【发布时间】: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)

标签: pic uart


【解决方案1】:

当我将输入的数据类型更改为 BOOLEAN HMT_WriteVPN32 函数时,该代码有效。

我应该输入 long 数据,但我想输入不可接受的 float

感谢你们与我一起解开这个谜团

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2012-02-15
    • 2014-01-25
    相关资源
    最近更新 更多