WK2114是国产的单个串口扩展为4个串口的芯片,串口1,串口2,串口3,串口4。
用的MCU是STM32F429 , 就是把STM32F429的串口1 扩展为 4个串口,
注意事项: wk2114速度奇慢,死慢死慢的,这是与STM32F429相比较而言,注意时间匹配。
下面直接上程序,均以WK2114串口1为例,其他串口以此类推 ,
这里接收通信用的是查询方式,没有用中断方式
初始化(WK2114串口1),
uart1_init(38400);
t=0x55;
send1_buff(&t,1); //设置WK2114自适应波特率38400
delay_00(10); //延时10mS
t=0x00; //00=GENA寄存器地址
send1_buff(&t, 1);
t=0x0f; //写入数据
send1_buff(&t, 1); //启动串口时钟
delay_00(10); //延时10mS
t=0x01; //01=GRST寄存器地址
send1_buff(&t, 1); //串口复位
t=0x0f;
send1_buff(&t, 1);
delay_00(10); //延时10mS
t=0x03; //03=SPACE寄存器地址
send1_buff(&t, 1);
t=0x01; //切换WK2114寄存器page=1
send1_buff(&t, 1);
delay_00(10); //延时10mS
t=0x05;
send1_buff(&t, 1);
t=0x2f; //波特率=9600,偶校验
send1_buff(&t, 1);
delay_00(10);
t=0x03; //03=SPACE寄存器地址
send1_buff(&t, 1);
t=0x00; //切换WK2114寄存器page=0
send1_buff(&t, 1);
delay_00(10);
t=0x04; //SCR子串口控制寄存器,收发使能
send1_buff(&t, 1);
t=0x03; //fifo_0
send1_buff(&t, 1);
delay_00(10);
t=0x05; //LCR子串口配置寄存器,偶校验
send1_buff(&t, 1);
t=0x0C; //fifo_0
send1_buff(&t, 1);
delay_00(10);
t=0x06; //FCR子串口FIFO控制寄存器,收发使能
send1_buff(&t, 1);
t=0x0C; //fifo_0
send1_buff(&t, 1);
delay_00(10);
发送数据
//发送数据//
n=10;
while(n--) //循环发送10次
{
t=0x0D; //FIFO_0
send1_buff(&t, 1);
t=0x11; //fifo_0 发送单字节=0x11
send1_buff(&t, 1);
t=0x0D;
send1_buff(&t, 1);
t=0xFF; //fifo_0 发送单字节=0xFF
send1_buff(&t, 1);
t=0x0D;
send1_buff(&t, 1);
t=0x00; //fifo_0 发送单字节=0x00
send1_buff(&t, 1);
t=0x0D;
send1_buff(&t, 1);
t=0x55; //fifo_0 发送单字节=0x55
send1_buff(&t, 1);
delay_00(1000);
}
接收数据
while(1)
{
rx1_n=0;
rx1_data[0]=0;
t=0x4A; //读FIFO数据个数,存储在rx1_data[0]中
send1_buff(&t, 1);
delay_00(1); //延时1mS
if(rx1_data[0]) //如果数据个数>0
{
m=rx1_data[0]; //m=数据个数
rx1_n=0;
t=0xC0|m; //多字节读取, 必须 m<=16字节
send1_buff(&t, 1);
delay_00(10); //延时10mS ,读出数据放在rx1_data[n]中
n=0;
while(m--) //发送读出的数据,必须m<=16个
{
t=0x0D; //数据在rx1_data[n]中
send1_buff(&t, 1); //fifo_0 发送单字节
send1_buff(&rx1_data[n++], 1);
}
}
//
GPIO_SetBits(GPIOB, GPIO_Pin_3); //RUN-led
delay_00(500);
GPIO_ResetBits(GPIOB, GPIO_Pin_3); //RUN-led
delay_00(500);
}
STM32F429 延时函数 ,芯片速度比较快,
void delay_00(u16 t) //延时1mS
{
u32 time;
while(t--)
{
time = 46000; //46000≈1ms
while(time--);
}
}
STM32F429 串口1发送函数
void send1_buff(u8 *p, u8 len)
{
while(len--)
{
USART_SendData(USART1, *(p++)); //向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
}
STM32F429串口1接收中断函数 ,rx1_data[255] , rx1_n为全局变量
void USART1_IRQHandler(void) //串口1中断服务程序
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
rx1_data[rx1_n++] =USART_ReceiveData(USART1); //(USART1->DR); //读取接收到的数据
}
}
版权声明:本文为qq_36272499原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。