历史上的今天
今天是:2025年08月05日(星期二)
2020年08月05日 | STM32+WK2124 SPI转4路串口驱动程序
2020-08-05 来源:51hei
WK2124 SPI接口 四通道通用异步收发器
1. 产品概述
WK2124是SPITM
接口的4通道UART器件。WK2124实现SPI桥接/扩展4个增强功能串口(UART)的功能。
扩展的子通道的UART具备如下功能特点:
每个子通道UART的波特率、字长、校验格式可以独立设置,最高可以提供2Mbps的通信速率。
每个子通道可以独立设置工作在IrDA红外通信。
每个子通道具备收/发独立的256 级FIFO,FIFO的中断可按用户需求进行编程触发点且具备超时中断功能。
WK2124采用SSOP20绿色环保的无铅封装,可以工作在2.5~5.0V的宽工作电压范围,具备可配置自动休眠/唤醒功能。
WK2124引脚图:
WK2124框图:
1、本程序是在STM32F103平台开发,使用的固件库是V3.5版本
单片机源程序如下:
#include "wk2xxx.h"
#include "spi.h"
#include "usart.h"
#include "delay.h"
void WK2XXX_RST_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA.4 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.4
GPIO_SetBits(GPIOA,GPIO_Pin_3); //PA.4 输出高
}
void WK2XXX_Reset_Init(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_3);//1
GPIO_ResetBits(GPIOA,GPIO_Pin_3);//0
delay_ms(10);
GPIO_SetBits(GPIOA,GPIO_Pin_3);//1
delay_ms(100);
}
/*************************************************************************/
//函数功能:初始化SPI片选信号CS,并把CS的默认状态设置为高电平
//
//
/*************************************************************************/
void SPI_CS_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3; //PA.4 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.4
GPIO_SetBits(GPIOA,GPIO_Pin_4); //PA.4 输出高
}
/*************************************************************************/
//函数功能:初始化SPI总线,设置SPI总线为0模式
/*************************************************************************/
void SPI_BUS_Init(void)
{
SPI1_Init(); //初始化SPI
SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //设置为10M时钟,高速模式
}
/*************************************************************************/
//函数功能:设置CS信号为高电平
/*************************************************************************/
void SPI_CS_H(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
}
/*************************************************************************/
//函数功能:设置CS信号为低电平
/*************************************************************************/
void SPI_CS_L(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
}
/*************************************************************************/
//函数功能:初始化SPI接口
/*************************************************************************/
void WK2XXX_SPI_Init(void)
{
SPI_CS_Init();
SPI_BUS_Init();
}
/*************************************************************************/
//函数功能:写寄存器函数(前提是该寄存器可写,某些寄存器如果你写1,可能会自动置1,具体见数据手册)
//参数:port:为子串口的数(C0C1)
// reg:为寄存器的地址(A3A2A1A0)
// dat:为写入寄存器的数据
//注意:在子串口被打通的情况下,向FDAT写入的数据会通过TX引脚输出
//*************************************************************************/
void Wk2xxxWriteReg(unsigned char port,unsigned char reg,unsigned char dat)
{
SPI_CS_L();//片选使能
SPI1_ReadWriteByte(((port-1)<<4)+reg); //写控制字节
SPI1_ReadWriteByte(dat); //写数据
SPI_CS_H();//片选无效
}
/*************************************************************************/
//函数功能:读寄存器函数
//参数:port:为子串口的数(C0C1)
// reg:为寄存器的地址(A3A2A1A0)
// rec_data:为读取到的寄存器值
//注意:在子串口被打通的情况下,读FDAT,实际上就是读取uart的rx接收的数据
/*************************************************************************/
unsigned char Wk2xxxReadReg(unsigned char port,unsigned char reg)
{
unsigned char rec_data;
SPI_CS_L(); //片选使能
SPI1_ReadWriteByte(0x40+((port-1)<<4)+reg);//写控制字节,控制命令构成见数据手册
rec_data=SPI1_ReadWriteByte(0);//接收返回的数据
SPI_CS_H(); //片选无效
return rec_data;
}
/**************************** Wk2xxxWriteFifo*********************************************/
//函数功能:该函数为写FIFO函数,通过该函数写入的数据会直接进入子串口的发送FIFO,然后通过TX引脚发送
//参数:port:为子串口的端口号(C0C1)
// *wbuf:写入数据部分
// len: 写入数据长度
//
/*************************************************************************/
void Wk2xxxWriteFifo(unsigned char port,unsigned char *wbuf,unsigned int len)
{ unsigned char n;
SPI_CS_L(); // 片选有效
SPI1_ReadWriteByte(0x80+((port-1)<<4)); //写FIFO控制指令
for(n=0;n SPI1_ReadWriteByte(*(wbuf+n)); } SPI_CS_H(); //片选无效 } /**************************** Wk2xxxReadFifo*********************************************/ //函数功能:该函数为读FIFO函数,通过该函数可以一次读出多个接收FIFO中的数据,最多256个字节 //参数:port:为子串口的端口号(C0C1) // *rbuf:写入数据部分 // len: 写入数据长度 // /*************************************************************************/ void Wk2xxxReadFifo(unsigned char port,unsigned char *rbuf,unsigned int len) { unsigned char n; SPI_CS_L();//片选有效 SPI1_ReadWriteByte(0xc0+((port-1)<<4)); //写读fifo控制指令 for(n=0;n *(rbuf+n)=SPI1_ReadWriteByte(0); } SPI_CS_H();//片选无效 //return 0; } /*************************************************************************/ //函数功能:此函数主要是通过读写wk2xxx的寄存器来判断主接口的通信时序是否有问题 //参数:无 //返回值:rv表示返回值,0成功 /*************************************************************************/ unsigned char Wk2xxxTest(void) { unsigned char rec_data,rv; //主接口为SPI rec_data=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GENA); if(rec_data==0x30) return rv; else { rv=1; return rv; } } /******************************Wk2xxxInit*******************************************/ //函数功能:本函数主要会初始化一些芯片基本寄存器; /*********************************************************************************/ void Wk2xxxInit(unsigned char port) { unsigned char gena,grst,gier,sier,scr; //使能子串口时钟 gena=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GENA); switch (port) { case 1://使能子串口1的时钟 gena|=WK2XXX_UT1EN; Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena); break; case 2://使能子串口2的时钟 gena|=WK2XXX_UT2EN; Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena); break; case 3://使能子串口3的时钟 gena|=WK2XXX_UT3EN; Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
史海拾趣
|
高性价比JLink V8+三用转接口出售了!(支持零售和团购) 高性价比JLink V8+三用转接口出售了! 加了个三用转接口,在FL2440和mini2440上都能用了,呵呵。 三个月质保:即三个月内有质量问题,厂家免费保修——来回邮费厂家包,元件费也是厂家出,用户不用处任何钱。 三个月过后有质量问题,客户承担运 ...… 查看全部问答> |
|
引言:当一个人想成为DIYER的时候,他能发现身边的每一样废弃的东西都能变成他想要的另一个东西。 1.昨天拆东西的时候发现小的电路板十分的难弄,不是往东就是往西乱跑没办法控制,到淘宝上一查 ...… 查看全部问答> |
|
目录 第I章——仪表放大器的基本原理 前言 仪表放大器与运算放大器的区别是什么? 信号放大与CMR 运算放大器与仪表放大器的CMR比较 差分放大器 在何处使用仪表放大器和差分放大器? 数据采集 医用仪器 监测和控制电子设 ...… 查看全部问答> |
|
本人设计一个信号发生器,如何使输出的波形幅值为(-10至+10)?需要什么元件? 设计设计一个信号发生器,如何使输出的波形幅值为(-10至+10)?需要使用什么元件?请大家多帮忙啊,小弟急求!… 查看全部问答> |
|
昨天烙焍坏,由于关门,我上日杂买把普通烙焍,看到同咱坛子果一样的手电筒,一问32,你拿就30吧,数了下就比19灯少两灯,且分两级亮,蓝色,大小差不多,我看大家的原理有的无比复杂,你设计的东东,应同市场接轨。应知道市场的分量。… 查看全部问答> |
|
为何我国的汽车电子行业如此“落伍”?在走访许多汽车电子行业专家和相关企业后,记者发现当前有四个“短板”导致国内汽车电子受制于人。这四个短板分别是汽车电子核心技术空心化严重、汽车电子行业组织机构不够完善、专业人才短缺以及对汽车电子 ...… 查看全部问答> |
|
前几天买了一个友善之臂的mini2440。哎,买来又不怎么想学了,感觉太急了,还没准备好学系统。暂时先不学了, 一个mini2440出给需要的朋友。 刚买来几天,几乎全新。 全套都在,什么电源,网线,串口线,仿真器,USB线, ...… 查看全部问答> |




