单串口扩展为4串口的芯片WK2114的使用(一)

  • Post author:
  • Post category:其他



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 版权协议,转载请附上原文出处链接和本声明。