单串口扩展为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);	//读取接收到的数据} 
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部