本帖最后由 聪聪哥哥 于 2025-1-17 13:28 编辑
享一下极海G32与工业串口屏的通讯经验;一:极海串口知识:
LPUART 支持全双工、异步、NRZ 串行通信,包括波特率发生器、发送器和接收器块。虽然发送器和接收器使用相同的波特率发生器,但是他们仍然独立工作。
主要特征:
1:全双工异步通信、NRZ 标准格式
2:可编程的串口特性
数据位:7 位,8位,9位或 10 位
校验位:偶校验、奇校验、无校验
停止位:1位或2位
3:可编程波特率,采样率为 4x到 32x
4:发送和接收波特率:异步运行至总线时钟。在停止模式下的操作、独立于总线时钟频率配置
5:三种接收器唤醒方法:空闲线路唤醒、地址标记唤醒、接收数据匹配
6:自动地址匹配:地址标记匹配、空闲线路地址匹配
7:支持 1、2、4、8、16、32、64或 128 个空闲字符的可配置空闲长度检测
8:可选 13 位中断字符生成/11 位中断字符检测
9:可选发送器输出和接收器输入极性
10:硬件流控支持请求发送(RTS)和清除发送(CTS)信号
11:可选 IrDA 1.4 RZI格式,脉冲宽度可编程
12:用于发送和接收的独立 FIFO 结构
单独的可配置阈值,用于发送和接收请求
如果接收 FIFO 不为空,则在可配置的空闲字符数后,接收器可选择产生请求
13:中断、DMA 或轮询操作
发送数据寄存器为空、发送完成、接收溢出、奇偶校验错误、支持 LIN 的中断检查、噪声错误、帧错误、接收引脚上的边沿活动、空闲接收器
二:工业串口屏知识:
这里使用的一款迪文公司的串口屏
部分代码如下:
/*切换界面功能函数*/
void SendTestData(char ID)
{
TXDBuffer[0] = 0x5A ;
TXDBuffer[1] = 0xA5 ;
TXDBuffer[2] = 0x07 ;
TXDBuffer[3] = 0x82 ;
TXDBuffer[4] = 0x00 ;
TXDBuffer[5] = 0x84 ;
TXDBuffer[6] = 0x5A ;
TXDBuffer[7] = 0x01 ;
TXDBuffer[8] = 0x00 ;
TXDBuffer[9] = ID ;
LPUART_TxDataBlocking(LPUART1_INSTANCE,
(uint8_t *)TXDBuffer,
10,
TX_TIMEOUT);
}
/*向指定指定发送 四字节数据*/
void Add_Write_Long_Data(uint16_t ucAdd, uint32_t uiDATA)
{
TXDBuffer[0] = 0x5A;
TXDBuffer[1] = 0xA5;
TXDBuffer[2] = 0x07;
TXDBuffer[3] = 0x82;
TXDBuffer[4] = ucAdd>>8;
TXDBuffer[5] = ucAdd;
TXDBuffer[6] = uiDATA>>24;
TXDBuffer[7] = uiDATA>>16;
TXDBuffer[8] = uiDATA>>8;
TXDBuffer[9] = uiDATA;
LPUART_TxDataBlocking(LPUART1_INSTANCE,
(uint8_t *)TXDBuffer,
10,
TX_TIMEOUT);
}
/*向指定指定发送 两字节数据*/
void Add_Write_Data(uint16_t ucAdd, uint16_t uiDATA)
{
TXDBuffer[0] = 0x5A;
TXDBuffer[1] = 0xA5;
TXDBuffer[2] = 0x05;
TXDBuffer[3] = 0x82;
TXDBuffer[4] = ucAdd>>8;
TXDBuffer[5] = ucAdd;
TXDBuffer[6] = uiDATA>>8;
TXDBuffer[7] = uiDATA;
LPUART_TxDataBlocking(LPUART1_INSTANCE,
(uint8_t *)TXDBuffer,
8,
TX_TIMEOUT);
}
/*向指定指定发送 显示文本函数*/
void Display_Text(uint16_t uiAdd, char *Str)
{
uint8_t ucLen;
int i;
ucLen = strlen(Str)+3;
TXDBuffer[0] = 0x5A;
TXDBuffer[1] = 0xA5;
TXDBuffer[2] = ucLen;
TXDBuffer[3] = 0x82;
TXDBuffer[4] = (uiAdd>>8);
TXDBuffer[5] = uiAdd;
i = 6;
while(*Str != 0)
{
TXDBuffer[i] = *Str;
i++;
Str++;
}
TXDBuffer[i] = 0;
LPUART_TxDataBlocking(LPUART1_INSTANCE,
(uint8_t *)TXDBuffer,
i+1,
TX_TIMEOUT);
}
/*绘制曲线功能函数*/
void DrawGraphLine(uint16_t uiDrawList )
{
TXDBuffer[0] = 0x5A;
TXDBuffer[1] = 0xA5;
TXDBuffer[2] = 0x0B;
TXDBuffer[3] = 0x82;
TXDBuffer[4] = 0x03; //曲线写启动
TXDBuffer[5] = 0x10;
TXDBuffer[6] = 0x5A; // 启动一次写数据
TXDBuffer[7] = 0xA5;
TXDBuffer[8] = 0x01; // 占用了几个通道
TXDBuffer[9] = 0x00;
TXDBuffer[10] = 0x00; // 占用了几个通道
TXDBuffer[11] = 0x01;
TXDBuffer[12] =( uiDrawList >> 8);
TXDBuffer[13] = uiDrawList ;
LPUART_TxDataBlocking(LPUART1_INSTANCE,
(uint8_t *)TXDBuffer,
14,
TX_TIMEOUT);
}
在程序初始化好串口部分后,在主程序内完成:界面切换功能
SendTestData(temp);
Add_Write_Long_Data (0X100,01);
Display_Text(0X5000,"极海半导体 21 IC测试");
temp++ ;
if(temp >=10) temp = 1 ;
OSIF_TimeDelay(200);
代码测试图如下所示:
实物测试图如下:
实物测试视频:
|