|
WK2124 SPI接口 四通道通用異步收發(fā)器
1. 產(chǎn)品概述
WK2124是SPITM
接口的4通道UART器件。WK2124實(shí)現(xiàn)SPI橋接/擴(kuò)展4個(gè)增強(qiáng)功能串口(UART)的功能。
擴(kuò)展的子通道的UART具備如下功能特點(diǎn):
每個(gè)子通道UART的波特率、字長(zhǎng)、校驗(yàn)格式可以獨(dú)立設(shè)置,最高可以提供2Mbps的通信速率。
每個(gè)子通道可以獨(dú)立設(shè)置工作在IrDA紅外通信。
每個(gè)子通道具備收/發(fā)獨(dú)立的256 級(jí)FIFO,F(xiàn)IFO的中斷可按用戶(hù)需求進(jìn)行編程觸發(fā)點(diǎn)且具備超時(shí)中斷功能。
WK2124采用SSOP20綠色環(huán)保的無(wú)鉛封裝,可以工作在2.5~5.0V的寬工作電壓范圍,具備可配置自動(dòng)休眠/喚醒功能。
WK2124引腳圖:
0.png (42.29 KB, 下載次數(shù): 82)
下載附件
2018-12-5 17:38 上傳
WK2124框圖:
0.png (58.94 KB, 下載次數(shù): 85)
下載附件
2018-12-5 17:38 上傳
1、本程序是在STM32F103平臺(tái)開(kāi)發(fā),使用的固件庫(kù)是V3.5版本
單片機(jī)源程序如下:
- #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端口時(shí)鐘
- 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); //根據(jù)設(shè)定參數(shù)初始化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);
-
- }
- /*************************************************************************/
- //函數(shù)功能:初始化SPI片選信號(hào)CS,并把CS的默認(rèn)狀態(tài)設(shè)置為高電平
- //
- //
- /*************************************************************************/
- void SPI_CS_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA,PD端口時(shí)鐘
- 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); //根據(jù)設(shè)定參數(shù)初始化GPIOA.4
- GPIO_SetBits(GPIOA,GPIO_Pin_4); //PA.4 輸出高
- }
- /*************************************************************************/
- //函數(shù)功能:初始化SPI總線(xiàn),設(shè)置SPI總線(xiàn)為0模式
- /*************************************************************************/
- void SPI_BUS_Init(void)
- {
- SPI1_Init(); //初始化SPI
- SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //設(shè)置為10M時(shí)鐘,高速模式
- }
- /*************************************************************************/
- //函數(shù)功能:設(shè)置CS信號(hào)為高電平
- /*************************************************************************/
- void SPI_CS_H(void)
- {
- GPIO_SetBits(GPIOA,GPIO_Pin_4);
- }
- /*************************************************************************/
- //函數(shù)功能:設(shè)置CS信號(hào)為低電平
- /*************************************************************************/
- void SPI_CS_L(void)
- {
- GPIO_ResetBits(GPIOA,GPIO_Pin_4);
- }
- /*************************************************************************/
- //函數(shù)功能:初始化SPI接口
- /*************************************************************************/
- void WK2XXX_SPI_Init(void)
- {
- SPI_CS_Init();
- SPI_BUS_Init();
-
-
- }
- /*************************************************************************/
- //函數(shù)功能:寫(xiě)寄存器函數(shù)(前提是該寄存器可寫(xiě),某些寄存器如果你寫(xiě)1,可能會(huì)自動(dòng)置1,具體見(jiàn)數(shù)據(jù)手冊(cè))
- //參數(shù):port:為子串口的數(shù)(C0C1)
- // reg:為寄存器的地址(A3A2A1A0)
- // dat:為寫(xiě)入寄存器的數(shù)據(jù)
- //注意:在子串口被打通的情況下,向FDAT寫(xiě)入的數(shù)據(jù)會(huì)通過(guò)TX引腳輸出
- //*************************************************************************/
- void Wk2xxxWriteReg(unsigned char port,unsigned char reg,unsigned char dat)
- {
- SPI_CS_L();//片選使能
- SPI1_ReadWriteByte(((port-1)<<4)+reg); //寫(xiě)控制字節(jié)
- SPI1_ReadWriteByte(dat); //寫(xiě)數(shù)據(jù)
- SPI_CS_H();//片選無(wú)效
- }
- /*************************************************************************/
- //函數(shù)功能:讀寄存器函數(shù)
- //參數(shù):port:為子串口的數(shù)(C0C1)
- // reg:為寄存器的地址(A3A2A1A0)
- // rec_data:為讀取到的寄存器值
- //注意:在子串口被打通的情況下,讀FDAT,實(shí)際上就是讀取uart的rx接收的數(shù)據(jù)
- /*************************************************************************/
- unsigned char Wk2xxxReadReg(unsigned char port,unsigned char reg)
- {
- unsigned char rec_data;
- SPI_CS_L(); //片選使能
- SPI1_ReadWriteByte(0x40+((port-1)<<4)+reg);//寫(xiě)控制字節(jié),控制命令構(gòu)成見(jiàn)數(shù)據(jù)手冊(cè)
- rec_data=SPI1_ReadWriteByte(0);//接收返回的數(shù)據(jù)
- SPI_CS_H(); //片選無(wú)效
- return rec_data;
- }
- /**************************** Wk2xxxWriteFifo*********************************************/
- //函數(shù)功能:該函數(shù)為寫(xiě)FIFO函數(shù),通過(guò)該函數(shù)寫(xiě)入的數(shù)據(jù)會(huì)直接進(jìn)入子串口的發(fā)送FIFO,然后通過(guò)TX引腳發(fā)送
- //參數(shù):port:為子串口的端口號(hào)(C0\C1)
- // *wbuf:寫(xiě)入數(shù)據(jù)部分
- // len: 寫(xiě)入數(shù)據(jù)長(zhǎng)度
- //
- /*************************************************************************/
- void Wk2xxxWriteFifo(unsigned char port,unsigned char *wbuf,unsigned int len)
- { unsigned char n;
- SPI_CS_L(); // 片選有效
- SPI1_ReadWriteByte(0x80+((port-1)<<4)); //寫(xiě)FIFO控制指令
- for(n=0;n<len;n++)
- {
- SPI1_ReadWriteByte(*(wbuf+n));
- }
- SPI_CS_H(); //片選無(wú)效
- }
- /**************************** Wk2xxxReadFifo*********************************************/
- //函數(shù)功能:該函數(shù)為讀FIFO函數(shù),通過(guò)該函數(shù)可以一次讀出多個(gè)接收FIFO中的數(shù)據(jù),最多256個(gè)字節(jié)
- //參數(shù):port:為子串口的端口號(hào)(C0\C1)
- // *rbuf:寫(xiě)入數(shù)據(jù)部分
- // len: 寫(xiě)入數(shù)據(jù)長(zhǎng)度
- //
- /*************************************************************************/
- void Wk2xxxReadFifo(unsigned char port,unsigned char *rbuf,unsigned int len)
- { unsigned char n;
- SPI_CS_L();//片選有效
- SPI1_ReadWriteByte(0xc0+((port-1)<<4)); //寫(xiě)讀fifo控制指令
- for(n=0;n<len;n++)
- {
- *(rbuf+n)=SPI1_ReadWriteByte(0);
- }
- SPI_CS_H();//片選無(wú)效
- //return 0;
- }
- /*************************************************************************/
- //函數(shù)功能:此函數(shù)主要是通過(guò)讀寫(xiě)wk2xxx的寄存器來(lái)判斷主接口的通信時(shí)序是否有問(wèn)題
- //參數(shù):無(wú)
- //返回值: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*******************************************/
- //函數(shù)功能:本函數(shù)主要會(huì)初始化一些芯片基本寄存器;
- /*********************************************************************************/
- void Wk2xxxInit(unsigned char port)
- {
- unsigned char gena,grst,gier,sier,scr;
- //使能子串口時(shí)鐘
- gena=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GENA);
- switch (port)
- {
- case 1://使能子串口1的時(shí)鐘
- gena|=WK2XXX_UT1EN;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
- break;
- case 2://使能子串口2的時(shí)鐘
- gena|=WK2XXX_UT2EN;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
- break;
- case 3://使能子串口3的時(shí)鐘
- gena|=WK2XXX_UT3EN;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
- break;
- case 4://使能子串口4的時(shí)鐘
- gena|=WK2XXX_UT4EN;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
- break;
- }
- //軟件復(fù)位子串口
- grst=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GRST);
- switch (port)
- {
- case 1://軟件復(fù)位子串口1
- grst|=WK2XXX_UT1RST;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
- break;
- case 2://軟件復(fù)位子串口2
- grst|=WK2XXX_UT2RST;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
- break;
- case 3://軟件復(fù)位子串口3
- grst|=WK2XXX_UT3RST;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
- break;
- case 4://軟件復(fù)位子串口4
- grst|=WK2XXX_UT4RST;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
- break;
- }
- //使能子串口中斷,包括子串口總中斷和子串口內(nèi)部的接收中斷,和設(shè)置中斷觸點(diǎn)
- gier=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GIER);
- switch (port)
- {
- case 1://子串口1中斷使能
- gier|=WK2XXX_UT1IE;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GIER,gier);
- break;
- case 2://子串口2中斷使能
- gier|=WK2XXX_UT2IE;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GIER,gier);
- break;
- case 3://子串口3中斷使能
- gier|=WK2XXX_UT3IE;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GIER,gier);
- break;
- case 4://子串口4中斷使能
- gier|=WK2XXX_UT4IE;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GIER,gier);
- break;
- }
- //使能子串口接收觸點(diǎn)中斷和超時(shí)中斷
- sier=Wk2xxxReadReg(port,WK2XXX_SIER);
- // sier |= WK2XXX_RFTRIG_IEN|WK2XXX_RXOUT_IEN;
- sier |= WK2XXX_RFTRIG_IEN;
- Wk2xxxWriteReg(port,WK2XXX_SIER,sier);
- // 初始化FIFO和設(shè)置固定中斷觸點(diǎn)
- Wk2xxxWriteReg(port,WK2XXX_FCR,0XFF);
- //設(shè)置任意中斷觸點(diǎn),如果下面的設(shè)置有效,那么上面FCR寄存器中斷的固定中斷觸點(diǎn)將失效
- Wk2xxxWriteReg(port,WK2XXX_SPAGE,1);//切換到page1
- Wk2xxxWriteReg(port,WK2XXX_RFTL,0X08);//設(shè)置接收觸點(diǎn)8個(gè)字節(jié)
- Wk2xxxWriteReg(port,WK2XXX_TFTL,0X10);//設(shè)置發(fā)送觸點(diǎn)為16個(gè)字節(jié)
- Wk2xxxWriteReg(port,WK2XXX_SPAGE,0);//切換到page0
- //使能子串口的發(fā)送和接收使能
- scr=Wk2xxxReadReg(port,WK2XXX_SCR);
- scr|=WK2XXX_TXEN|WK2XXX_RXEN;
- Wk2xxxWriteReg(port,WK2XXX_SCR,scr);
- }
- /******************************Wk2xxxClose*******************************************/
- //函數(shù)功能:本函數(shù)會(huì)關(guān)閉當(dāng)前子串口,和復(fù)位初始值;
- /*********************************************************************************/
- void Wk2xxxClose(unsigned char port)
- {
- unsigned char gena,grst;
- //復(fù)位子串口
- grst=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GRST);
- switch (port)
- {
- case 1://軟件復(fù)位子串口1
- grst|=WK2XXX_UT1RST;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
- break;
- case 2://軟件復(fù)位子串口2
- grst|=WK2XXX_UT2RST;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
- break;
- case 3://軟件復(fù)位子串口3
- grst|=WK2XXX_UT3RST;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
- break;
- case 4://軟件復(fù)位子串口4
- grst|=WK2XXX_UT4RST;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
- break;
- }
- //關(guān)閉子串口時(shí)鐘
- gena=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GENA);
- switch (port)
- {
- case 1://使能子串口1的時(shí)鐘
- gena&=~WK2XXX_UT1EN;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
- break;
- case 2://使能子串口2的時(shí)鐘
- gena&=~WK2XXX_UT2EN;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
- break;
- case 3://使能子串口3的時(shí)鐘
- gena&=~WK2XXX_UT3EN;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
- break;
- case 4://使能子串口4的時(shí)鐘
- gena&=~WK2XXX_UT4EN;
- Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
- break;
- }
- }
- /**************************Wk2xxxSetBaud*******************************************************/
- //函數(shù)功能:設(shè)置子串口波特率函數(shù)、此函數(shù)中波特率的匹配值是根據(jù)11.0592Mhz下的外部晶振計(jì)算的
- // port:子串口號(hào)
- // baud:波特率大小.波特率表示方式,
- //
- /**************************Wk2xxxSetBaud*******************************************************/
- void Wk2xxxSetBaud(unsigned char port,int baud)
- {
- unsigned char baud1,baud0,pres,scr;
- //如下波特率相應(yīng)的寄存器值,是在外部時(shí)鐘為11.0592的情況下計(jì)算所得,如果使用其他晶振,需要重新計(jì)算
- switch (baud)
- {
- case 600:
- baud1=0x4;
- baud0=0x7f;
- pres=0;
- break;
- case 1200:
- baud1=0x2;
- baud0=0x3F;
- pres=0;
- break;
- case 2400:
- baud1=0x1;
- baud0=0x1f;
- pres=0;
- break;
- case 4800:
- baud1=0x00;
- baud0=0x8f;
- pres=0;
- break;
- case 9600:
- baud1=0x00;
- baud0=0x47;
- pres=0;
- break;
- case 19200:
- baud1=0x00;
- baud0=0x23;
- pres=0;
- break;
- case 38400:
- baud1=0x00;
- baud0=0x11;
- pres=0;
- break;
-
- case 76800:
- baud1=0x00;
- baud0=0x08;
- pres=0;
- break;
-
- case 1800:
- baud1=0x01;
- baud0=0x7f;
- pres=0;
- break;
- case 3600:
- baud1=0x00;
- baud0=0xbf;
- pres=0;
- break;
- case 7200:
- baud1=0x00;
- baud0=0x5f;
- pres=0;
- break;
- case 14400:
- baud1=0x00;
- baud0=0x2f;
- pres=0;
- break;
- case 28800:
- baud1=0x00;
- baud0=0x17;
- pres=0;
- break;
- case 57600:
- baud1=0x00;
- baud0=0x0b;
- pres=0;
- break;
- case 115200:
- baud1=0x00;
- baud0=0x05;
- pres=0;
- break;
- case 230400:
- baud1=0x00;
- baud0=0x02;
- pres=0;
- break;
- default:
- baud1=0x00;
- baud0=0x00;
- pres=0;
- }
- //關(guān)掉子串口收發(fā)使能
- scr=Wk2xxxReadReg(port,WK2XXX_SCR);
- Wk2xxxWriteReg(port,WK2XXX_SCR,0);
- //設(shè)置波特率相關(guān)寄存器
- Wk2xxxWriteReg(port,WK2XXX_SPAGE,1);//切換到page1
- Wk2xxxWriteReg(port,WK2XXX_BAUD1,baud1);
- Wk2xxxWriteReg(port,WK2XXX_BAUD0,baud0);
- Wk2xxxWriteReg(port,WK2XXX_PRES,pres);
- Wk2xxxWriteReg(port,WK2XXX_SPAGE,0);//切換到page0
- //使能子串口收發(fā)使能
- Wk2xxxWriteReg(port,WK2XXX_SCR,scr);
-
-
- }
- /*****************************Wk2xxxSendBuf****************************************/
- //本函數(shù)為子串口發(fā)送數(shù)據(jù)的函數(shù),發(fā)送數(shù)據(jù)到子串口的FIFO.然后通過(guò)再發(fā)送
- //參數(shù)說(shuō)明:port:子串口端口號(hào)
- // *sendbuf:需要發(fā)送的數(shù)據(jù)buf
- // len:需要發(fā)送數(shù)據(jù)的長(zhǎng)度
- // 函數(shù)返回值:實(shí)際成功發(fā)送的數(shù)據(jù)
- //說(shuō)明:調(diào)用此函數(shù)只是把數(shù)據(jù)寫(xiě)入子串口的發(fā)送FIFO,然后再發(fā)送。1、首先確認(rèn)子串口的發(fā)送FIFO有多少數(shù)據(jù),根據(jù)具體情況、
- //確定寫(xiě)入FIFO數(shù)據(jù)的個(gè)數(shù),
- /*********************************************************************/
- unsigned int Wk2xxxSendBuf(unsigned char port,unsigned char *sendbuf,unsigned int len)
- {
- unsigned int ret,tfcnt,sendlen;
- unsigned char fsr;
-
- fsr=Wk2xxxReadReg(port,WK2XXX_FSR);
- if(~fsr&WK2XXX_TFULL )//子串口發(fā)送FIFO未滿(mǎn)
- {
- tfcnt=Wk2xxxReadReg(port,WK2XXX_TFCNT);//讀子串口發(fā)送fifo中數(shù)據(jù)個(gè)數(shù)
- sendlen=256-tfcnt;//FIFO能寫(xiě)入的最多字節(jié)數(shù)
-
- if(sendlen<len)
- {
- ret=sendlen;
- Wk2xxxWriteFifo(port,sendbuf,sendlen);
- }
- else
- {
- Wk2xxxWriteFifo(port,sendbuf,len);
- ret=len;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
WK2124_DS_CN_V011_2017-09.pdf
(1.28 MB, 下載次數(shù): 142)
2018-12-3 17:43 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
WK2124_irq(STM32).rar
(429.33 KB, 下載次數(shù): 232)
2018-12-5 17:39 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|