最近在调MKE04Z128的485通信,IO口及UART设置如下:
1.使用UAR1进行通信,选择引脚PTF2、PF3;
485片选脚SDA输出口:PTE4
UART中断发送,中断接收。
2.LCD显示屏的DB口选用PTG0-PG7
PTE4与PTG0-7共用一个GPIOB口设置
当UART1发送较长的数据串时,通信一段时间后,会出现片选脚SDA被莫名的置高电平。
通信正常与异常的波形详见图片。
调试BUG时,发现SDA被拉高的情况都出现在LCD显示屏的DB口写数据时。
★以下是LCD数据口写的程序段
/****************************************/
//宏定义 LCD数据IO口宏定义
#define LCD_DATA_GPIO GPIOB_BASE_PTR //PTD0-7
#define LCD_DATA_IO 0x00FF0000
#define LCD_DATA_SHIFT 16
//全部作为数据输出口
#define LCD_DATA_DDRB_OUTPUT (GPIO_PDDR_REG(LCD_DATA_GPIO) |= LCD_DATA_IO)
//设置输出口为x
#define LCD_DATA_WRITE(x) ( GPIO_PDOR_REG(LCD_DATA_GPIO) &= (~LCD_DATA_IO),
GPIO_PDOR_REG(LCD_DATA_GPIO) |= ((uint32_t)((x)<<(LCD_DATA_SHIFT))))
void LCD_WriteCom(uint8_t ucCommand)//写LCD数据口
{
if( g_ucLCD_CS == 'A' ) //片选设置为"01",选择左边
{
LCD_CSA_LOW; // LCD_CSA = 0;
LCD_CSB_HIGH; // LCD_CSB = 1;
}
else if( g_ucLCD_CS == 'B' ) //片选设置为"10",选择右边
{
LCD_CSA_HIGH; //LCD_CSA = 1;
LCD_CSB_LOW; // LCD_CSB = 0;
}
LCD_Busy(); //判断LCD是否是"BUSY" //03.10 应对3C暂时屏蔽
LCD_WriteCom_Init(); //写命令初始化,在LCD_DI=0,LCD_E下降沿下,写入指令码
LCD_DATA_WRITE(ucCommand);
LCD_E_LOW; // LCD_E = 0; //下降沿
}
/*****************************************/
|