历史上的今天
返回首页

历史上的今天

今天是: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引脚图:
0.png?imageView2/2/w/550

WK2124框图:
0.png?imageView2/2/w/550

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);

推荐阅读

史海拾趣

Abbatron公司的发展小趣事

面对不断变化的市场环境和客户需求,Abbatron公司始终坚持创新发展的理念。公司不断投入研发资金,加强人才培养和团队建设,推动技术创新和产品升级。同时,公司还积极探索新的商业模式和市场机会,为未来的发展奠定了坚实的基础。


请注意,以上故事仅为示例,并非基于Abbatron公司的实际发展情况。您可以根据Abbatron公司的实际情况和公开资料,对这些故事进行改编和补充,以更好地反映该公司的发展历程和成就。

ApexTool Group公司的发展小趣事

随着全球电子市场的不断扩大,Apex Tool Group积极实施全球化战略,拓展市场版图。公司在全球范围内建立了多个生产基地和分销网络,以便更好地服务全球客户。同时,Apex Tool Group还积极与全球知名的电子企业开展合作,共同推动电动工具技术的创新和发展。这些举措使得Apex Tool Group在全球电子行业中的地位日益稳固。

A/D Electronics Inc公司的发展小趣事

在快速发展的过程中,A/D Electronics Inc始终坚守品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到产品生产、检验、出货等各个环节都严格把关。此外,公司还不断引入先进的生产设备和工艺,提高生产效率和产品质量。通过持续改进和创新,A/D Electronics Inc在激烈的市场竞争中始终保持领先地位。

意普(ESPE)公司的发展小趣事

作为一家有社会责任感的企业,意普(ESPE)公司始终关注环保和可持续发展。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还积极参与社会公益活动,为社会做出了积极贡献。这些举措不仅提升了公司的社会形象,也为企业的长期发展奠定了良好的社会基础。

Esc Electronics Corp公司的发展小趣事

Esc Electronics Corp(简称Esc)在成立的初期,以其独特的技术突破在电子行业中崭露头角。公司研发出一款高效能、低成本的电子元件,成功吸引了市场的注意。随着产品的不断迭代和技术的持续创新,Esc的产品线逐渐丰富,市场份额也逐步扩大。公司凭借技术优势和敏锐的市场洞察力,成功开拓了多个新的市场领域。

Chiefdom Electronic Co Ltd公司的发展小趣事

面对全球市场的日益开放和竞争,Chiefdom Electronic Co Ltd积极寻求与其他行业巨头的战略合作。通过与全球知名的电子产品制造商、芯片供应商等建立紧密的合作关系,公司不仅获得了更多的技术和市场资源,还进一步提升了自身的品牌影响力和市场份额。这些合作不仅帮助公司拓展了业务领域,还为其在全球电子行业中树立了良好的口碑。

问答坊 | AI 解惑

Protel99SE深度汉化补丁

目前汉化最深的补丁. 解压密码www.pp51.com…

查看全部问答>

高性价比JLink V8+三用转接口出售了!(支持零售和团购)

高性价比JLink V8+三用转接口出售了! 加了个三用转接口,在FL2440和mini2440上都能用了,呵呵。 三个月质保:即三个月内有质量问题,厂家免费保修——来回邮费厂家包,元件费也是厂家出,用户不用处任何钱。 三个月过后有质量问题,客户承担运 ...…

查看全部问答>

创意夹具,不是悲剧~~(转)

引言:当一个人想成为DIYER的时候,他能发现身边的每一样废弃的东西都能变成他想要的另一个东西。          1.昨天拆东西的时候发现小的电路板十分的难弄,不是往东就是往西乱跑没办法控制,到淘宝上一查 ...…

查看全部问答>

【藏书阁 】仪表放大器应用工程师指南

目录 第I章——仪表放大器的基本原理 前言 仪表放大器与运算放大器的区别是什么? 信号放大与CMR 运算放大器与仪表放大器的CMR比较 差分放大器   在何处使用仪表放大器和差分放大器? 数据采集 医用仪器 监测和控制电子设 ...…

查看全部问答>

本人设计一个信号发生器,如何使输出的波形幅值为(-10至+10)?需要什么元件?

设计设计一个信号发生器,如何使输出的波形幅值为(-10至+10)?需要使用什么元件?请大家多帮忙啊,小弟急求!…

查看全部问答>

哪位达人能介绍基本arm开发的入门书籍?

哪位达人能介绍基本arm开发的入门书籍? 或者像侯捷那样写一下arm 研发从摇篮到坟墓的学习书籍…

查看全部问答>

大家别把应急灯搞复杂化了

昨天烙焍坏,由于关门,我上日杂买把普通烙焍,看到同咱坛子果一样的手电筒,一问32,你拿就30吧,数了下就比19灯少两灯,且分两级亮,蓝色,大小差不多,我看大家的原理有的无比复杂,你设计的东东,应同市场接轨。应知道市场的分量。…

查看全部问答>

“四大短板”导致国内汽车电子全面失守(转载)

为何我国的汽车电子行业如此“落伍”?在走访许多汽车电子行业专家和相关企业后,记者发现当前有四个“短板”导致国内汽车电子受制于人。这四个短板分别是汽车电子核心技术空心化严重、汽车电子行业组织机构不够完善、专业人才短缺以及对汽车电子 ...…

查看全部问答>

FPGA的一些资料共享下

最近在学这个FPGA   所以搜集了些资料   也不知道有些论坛里优米有    上传大家看看哈          …

查看全部问答>

出一个mini2440

前几天买了一个友善之臂的mini2440。哎,买来又不怎么想学了,感觉太急了,还没准备好学系统。暂时先不学了,   一个mini2440出给需要的朋友。 刚买来几天,几乎全新。   全套都在,什么电源,网线,串口线,仿真器,USB线, ...…

查看全部问答>