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

一片WK2114有四路串口,编号分别为0,1,2,3

0---1#串口

1----2#串口

2-----3#串口

3-----4#串口

下面是四个串口全部初始化程序

//wk2114 主串口波特率 自适应
void wk2114_Port_bd(void)
{
	u8	t=0x55;	
	send1_buff(&t,1);
}


void wk2114_ini(void)
{
		u8	t;
	
		t=0x00;						//00=GENA全局控制寄存器地址
		send1_buff(&t, 1);	
		t=0x0f;						//写入数据
		send1_buff(&t, 1);			//启动串口1,串口2,串口3,串口4时钟	
		Delay(10);					//延时10mS
	
		t=0x01;						//01=GRST寄存器地址
		send1_buff(&t, 1);			//串口复位
		t=0x0f;						//串口1,串口2,串口3,串口4复位
		send1_buff(&t, 1);
		Delay(10);					//延时10mS
}

// WK2114 芯片寄存器 初始化 line=0,1,2,3
//0=串口0
//1=串口1
//2=串口2
//3=串口3
void wk2114_init(u8	line)
{
		u8	t;
		
		t=0x03|line<<4;				//03=SPACE页控制寄存器地址
		send1_buff(&t, 1);
		t=0x01;						//切换WK2114寄存器page=1,第一页
		send1_buff(&t, 1);
		Delay(10);					//延时10mS
		
		t=0x05|line<<4;				//波特率配置寄存器低字节
		send1_buff(&t, 1);
		t=0x2f;						//波特率=9600,偶校验
		send1_buff(&t, 1);
		Delay(10);

		t=0x03|line<<4;				//03=SPACE页寄存器地址
		send1_buff(&t, 1);
		t=0x00;						//切换WK2114寄存器page=0
		send1_buff(&t, 1);
		Delay(10);
		
		t=0x04|line<<4;				//SCR子串口控制寄存器,收发使能
		send1_buff(&t, 1);
		t=0x03;						//fifo_0,1,2,3
		send1_buff(&t, 1);
		Delay(10);
		
		t=0x05|line<<4;				//LCR子串口配置寄存器,偶校验
		send1_buff(&t, 1);
		t=0x0C;						//fifo_0,1,2,3
		send1_buff(&t, 1);
		Delay(10);
		
		t=0x06|line<<4;				//FCR子串口FIFO控制寄存器,收发使能
		send1_buff(&t, 1);
		t=0x0C;						//fifo_0,1,2,3
		send1_buff(&t, 1);
		Delay(10);
}


//WK2114发送一个字节
//line=0,1,2,3,串口号
void wk2114_send_byte(u8 line,u8 data)
	{
		u8	t;	
		t=0x80|line<<4;				//FIFO_0 ,8=write,0=串口1,0=1字节长度
		send1_buff(&t, 1);			//fifo_0 发送单字节=data
		send1_buff(&data, 1);
	}
	
	
//WK2114发送n个字节,n<=16
//line=0,1,2,3,串口号
//p=待发送数据指针	
void wk2114_send_nbyte(u8 line,u8 *p,u8 n)
	{
		u8	t;	
		n--;
		t=0x80|line<<4|n;			//8=write,串口号,n=字节长度
		send1_buff(&t, 1);			
		n++;
		while(n--)					//发送n字节
		send1_buff(p++, 1);
	}	
	
	
//返回收到的数据个数,line=0,1,2,3
//line=0,1,2,3,串口号	
u8	wk2114_recived(u8	line)
	{
	u8		m,t;
	
			rx1_n=0;
			rx1_data[0]=0;
			t=0x4A|line<<4;			//读FIFO数据个数,存储在rx1_data[0]中
			send1_buff(&t, 1);
			Delay(1);				//延时1mS
			
			if(rx1_data[0])			//如果接收数据个数>0
				{
				rx1_n=0;
				m=rx1_data[0];	
				t=0xC0|rx1_data[0]|line<<4;	//多字节读取,必须 rx1_data[0]<=16字节
				send1_buff(&t, 1);	//开始启动读取数据		
				Delay(10);			//延时10mS ,读出数据放在rx1_data[n]中
				return	m;			//接收个数=m
				}
				else 
				return	0;	
				
	}
	

下面是主函数MAIN()

u8	rx1_data[255]={0};

int main(void)
{
	u8	m;
	u8 datatemp[20];
	uart1_init(38400);			

	wk2114_Port_bd();		//设置WK2114自适应波特率38400
	
	Delay(10);				//延时10mS
	wk2114_ini();
	wk2114_init(0);			//初始化串口0
	Delay(10);				//延时10mS
	wk2114_init(1);			//初始化串口1
	Delay(10);				//延时10mS
	wk2114_init(2);			//初始化串口2
	Delay(10);				//延时10mS
	wk2114_init(3);			//初始化串口3
	Delay(10);				//延时10mS

	while(1)
    	{	
	    wk2114_send_byte(2,datatemp[0]);    //2#串口发送单字节
	    wk2114_send_byte(2,datatemp[1]);
	    wk2114_send_byte(2,datatemp[2]);
	    wk2114_send_byte(2,datatemp[3]);
	    wk2114_send_byte(2,datatemp[4]);
	    wk2114_send_byte(2,datatemp[5]);
	    wk2114_send_byte(2,datatemp[6]);
	    wk2114_send_byte(2,datatemp[7]);
	    wk2114_send_nbyte(2,data,6);
		
	    m=wk2114_recived(3);                //3#串口查询,
	    if(m)
	    wk2114_send_nbyte(3,rx1_data,4);	//3#串口发送4个数据
	    GPIOB->ODR^=GPIO_Pin_3;			    //RUN-led指示灯
		Delay(500);				            //延时500mS
	
	    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值