单串口扩展为4串口的芯片WK2114的使用(一)
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自适应波特率38400delay_00(10); //延时10mSt=0x00; //00=GENA寄存器地址send1_buff(&t, 1); t=0x0f; //写入数据send1_buff(&t, 1); //启动串口时钟 delay_00(10); //延时10mSt=0x01; //01=GRST寄存器地址send1_buff(&t, 1); //串口复位t=0x0f;send1_buff(&t, 1);delay_00(10); //延时10mSt=0x03; //03=SPACE寄存器地址send1_buff(&t, 1);t=0x01; //切换WK2114寄存器page=1send1_buff(&t, 1);delay_00(10); //延时10mSt=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=0send1_buff(&t, 1);delay_00(10);t=0x04; //SCR子串口控制寄存器,收发使能send1_buff(&t, 1);t=0x03; //fifo_0send1_buff(&t, 1);delay_00(10);t=0x05; //LCR子串口配置寄存器,偶校验send1_buff(&t, 1);t=0x0C; //fifo_0send1_buff(&t, 1);delay_00(10);t=0x06; //FCR子串口FIFO控制寄存器,收发使能send1_buff(&t, 1);t=0x0C; //fifo_0send1_buff(&t, 1);delay_00(10);
发送数据
//发送数据// n=10;while(n--) //循环发送10次{t=0x0D; //FIFO_0send1_buff(&t, 1);t=0x11; //fifo_0 发送单字节=0x11send1_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 发送单字节=0x00send1_buff(&t, 1);t=0x0D;send1_buff(&t, 1);t=0x55; //fifo_0 发送单字节=0x55send1_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); //延时1mSif(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-leddelay_00(500);GPIO_ResetBits(GPIOB, GPIO_Pin_3); //RUN-leddelay_00(500);}
STM32F429 延时函数 ,芯片速度比较快,
void delay_00(u16 t) //延时1mS
{u32 time; while(t--) {time = 46000; //46000≈1mswhile(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); //读取接收到的数据}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
