欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32+WK2124 SPI轉4路串口驅動程序源碼下載
[打印本頁]
作者:
0520kuang
時間:
2018-12-3 17:44
標題:
STM32+WK2124 SPI轉4路串口驅動程序源碼下載
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
(42.29 KB, 下載次數: 82)
下載附件
2018-12-5 17:38 上傳
WK2124框圖:
0.png
(58.94 KB, 下載次數: 85)
下載附件
2018-12-5 17:38 上傳
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:為子串口的端口號(C0\C1)
// *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<len;n++)
{
SPI1_ReadWriteByte(*(wbuf+n));
}
SPI_CS_H(); //片選無效
}
/**************************** Wk2xxxReadFifo*********************************************/
//函數功能:該函數為讀FIFO函數,通過該函數可以一次讀出多個接收FIFO中的數據,最多256個字節
//參數:port:為子串口的端口號(C0\C1)
// *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<len;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);
break;
case 4://使能子串口4的時鐘
gena|=WK2XXX_UT4EN;
Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
break;
}
//軟件復位子串口
grst=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GRST);
switch (port)
{
case 1://軟件復位子串口1
grst|=WK2XXX_UT1RST;
Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
case 2://軟件復位子串口2
grst|=WK2XXX_UT2RST;
Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
case 3://軟件復位子串口3
grst|=WK2XXX_UT3RST;
Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
case 4://軟件復位子串口4
grst|=WK2XXX_UT4RST;
Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
}
//使能子串口中斷,包括子串口總中斷和子串口內部的接收中斷,和設置中斷觸點
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;
}
//使能子串口接收觸點中斷和超時中斷
sier=Wk2xxxReadReg(port,WK2XXX_SIER);
// sier |= WK2XXX_RFTRIG_IEN|WK2XXX_RXOUT_IEN;
sier |= WK2XXX_RFTRIG_IEN;
Wk2xxxWriteReg(port,WK2XXX_SIER,sier);
// 初始化FIFO和設置固定中斷觸點
Wk2xxxWriteReg(port,WK2XXX_FCR,0XFF);
//設置任意中斷觸點,如果下面的設置有效,那么上面FCR寄存器中斷的固定中斷觸點將失效
Wk2xxxWriteReg(port,WK2XXX_SPAGE,1);//切換到page1
Wk2xxxWriteReg(port,WK2XXX_RFTL,0X08);//設置接收觸點8個字節
Wk2xxxWriteReg(port,WK2XXX_TFTL,0X10);//設置發送觸點為16個字節
Wk2xxxWriteReg(port,WK2XXX_SPAGE,0);//切換到page0
//使能子串口的發送和接收使能
scr=Wk2xxxReadReg(port,WK2XXX_SCR);
scr|=WK2XXX_TXEN|WK2XXX_RXEN;
Wk2xxxWriteReg(port,WK2XXX_SCR,scr);
}
/******************************Wk2xxxClose*******************************************/
//函數功能:本函數會關閉當前子串口,和復位初始值;
/*********************************************************************************/
void Wk2xxxClose(unsigned char port)
{
unsigned char gena,grst;
//復位子串口
grst=Wk2xxxReadReg(WK2XXX_GPORT,WK2XXX_GRST);
switch (port)
{
case 1://軟件復位子串口1
grst|=WK2XXX_UT1RST;
Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
case 2://軟件復位子串口2
grst|=WK2XXX_UT2RST;
Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
case 3://軟件復位子串口3
grst|=WK2XXX_UT3RST;
Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
case 4://軟件復位子串口4
grst|=WK2XXX_UT4RST;
Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
}
//關閉子串口時鐘
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);
break;
case 4://使能子串口4的時鐘
gena&=~WK2XXX_UT4EN;
Wk2xxxWriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
break;
}
}
/**************************Wk2xxxSetBaud*******************************************************/
//函數功能:設置子串口波特率函數、此函數中波特率的匹配值是根據11.0592Mhz下的外部晶振計算的
// port:子串口號
// baud:波特率大小.波特率表示方式,
//
/**************************Wk2xxxSetBaud*******************************************************/
void Wk2xxxSetBaud(unsigned char port,int baud)
{
unsigned char baud1,baud0,pres,scr;
//如下波特率相應的寄存器值,是在外部時鐘為11.0592的情況下計算所得,如果使用其他晶振,需要重新計算
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;
}
//關掉子串口收發使能
scr=Wk2xxxReadReg(port,WK2XXX_SCR);
Wk2xxxWriteReg(port,WK2XXX_SCR,0);
//設置波特率相關寄存器
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
//使能子串口收發使能
Wk2xxxWriteReg(port,WK2XXX_SCR,scr);
}
/*****************************Wk2xxxSendBuf****************************************/
//本函數為子串口發送數據的函數,發送數據到子串口的FIFO.然后通過再發送
//參數說明:port:子串口端口號
// *sendbuf:需要發送的數據buf
// len:需要發送數據的長度
// 函數返回值:實際成功發送的數據
//說明:調用此函數只是把數據寫入子串口的發送FIFO,然后再發送。1、首先確認子串口的發送FIFO有多少數據,根據具體情況、
//確定寫入FIFO數據的個數,
/*********************************************************************/
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 )//子串口發送FIFO未滿
{
tfcnt=Wk2xxxReadReg(port,WK2XXX_TFCNT);//讀子串口發送fifo中數據個數
sendlen=256-tfcnt;//FIFO能寫入的最多字節數
if(sendlen<len)
{
ret=sendlen;
Wk2xxxWriteFifo(port,sendbuf,sendlen);
}
else
{
Wk2xxxWriteFifo(port,sendbuf,len);
ret=len;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
WK2124_DS_CN_V011_2017-09.pdf
(1.28 MB, 下載次數: 142)
2018-12-3 17:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
WK2124_irq(STM32).rar
(429.33 KB, 下載次數: 232)
2018-12-5 17:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2018-12-5 17:40
好資料,51黑有你更精彩!!!
作者:
後輪追前輪
時間:
2019-2-28 11:45
學習,感謝分享
作者:
jianfeii
時間:
2019-3-21 16:56
程序這塊寫的很清楚,非常棒
作者:
ffme
時間:
2019-5-5 21:43
WK2124的資料貌似比較少
作者:
ffme
時間:
2019-5-5 21:44
感謝樓主分享
作者:
liweifoic
時間:
2019-6-14 11:58
想學習一下!!!!!!!!!!!!!!!!!
作者:
fuyuns6
時間:
2019-7-12 14:13
學習,感謝分享
作者:
frf111
時間:
2019-7-22 18:49
感謝分享
作者:
38040152
時間:
2019-7-31 14:13
好東西,感謝分享
作者:
panhao96321
時間:
2019-8-22 14:36
寫的非常不錯,感謝分享!
作者:
wicky110
時間:
2019-8-23 08:41
這是我一直想要看的資料,謝謝分享!
作者:
劉拉沙2
時間:
2019-9-18 11:05
好東西啊
作者:
liuhiong
時間:
2019-9-18 23:41
好資料,先收藏學習。
作者:
earvin_rain
時間:
2019-9-19 10:18
很好的資料,謝謝樓主,學習一下。。。。
作者:
happybbs163
時間:
2019-9-27 11:03
實測有用 很好的例子。謝謝分享
作者:
lh200510
時間:
2019-10-18 13:35
很好的資料,多謝樓主
作者:
plainsailing
時間:
2019-11-29 15:17
很好的資料,謝謝樓主分享
作者:
啥玩意啊
時間:
2020-3-19 18:40
好資料,等我簽到五天了就來下載
作者:
shine_alive
時間:
2020-5-5 16:21
正好用到,學習一下,謝謝
作者:
lianbus
時間:
2020-5-11 22:33
正好需要這個,現在都2020年了,大家還都在用這個
作者:
resumebb
時間:
2020-7-24 14:00
請問一下,如果要移植到stm32f407上去,需要做些什么變動呢
作者:
892698133
時間:
2021-1-27 17:19
大佬門。這個片子在項目上穩定么
作者:
0957
時間:
2021-8-3 15:50
好資料,51黑有你更精彩!!!
作者:
YZM168
時間:
2021-8-5 09:39
我的黑幣沒有了,隔幾天再來
作者:
kevintang82
時間:
2021-8-22 14:35
好資料,51黑有你更精彩!!!
作者:
luyaocfan
時間:
2021-11-19 10:12
非常感謝, 希望趕緊能攢夠黑幣來下載。
作者:
yuyunfei88
時間:
2022-9-25 16:28
現在2022年,用到這個片子,借來測試一下,非常感謝
作者:
pcf2000
時間:
2024-12-19 10:20
不知道這款IC 用在項目上,穩定不,,,先下載學習一下
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1