#ifndef __wk2xxx_H
#define __wk2xxx_H
#include "stm32f10x.h"
#include "misc.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_usart.h"
//定義函數
#define TPT_UART3_Enable() USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
#define TPT_UART3_Disable() USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);
#define WK2XXX_GENA 0X00
#define WK2XXX_GRST 0X01
#define WK2XXX_GMUT 0X02
#define WK2XXX_GIER 0X10
#define WK2XXX_GIFR 0X11
#define WK2XXX_GPDIR 0X21
#define WK2XXX_GPDAT 0X31
#define WK2XXX_GPORT 1// /wkxxxx Global rigister of PORT
//wkxxxx slave uarts rigister address defines
#define WK2XXX_SPAGE 0X03
//PAGE0
#define WK2XXX_SCR 0X04
#define WK2XXX_LCR 0X05
#define WK2XXX_FCR 0X06
#define WK2XXX_SIER 0X07
#define WK2XXX_SIFR 0X08
#define WK2XXX_TFCNT 0X09
#define WK2XXX_RFCNT 0X0A
#define WK2XXX_FSR 0X0B
#define WK2XXX_LSR 0X0C
#define WK2XXX_FDAT 0X0D
#define WK2XXX_FWCR 0X0E
#define WK2XXX_RS485 0X0F
//PAGE1
#define WK2XXX_BAUD1 0X04
#define WK2XXX_BAUD0 0X05
#define WK2XXX_PRES 0X06
#define WK2XXX_RFTL 0X07
#define WK2XXX_TFTL 0X08
#define WK2XXX_FWTH 0X09
#define WK2XXX_FWTL 0X0A
#define WK2XXX_XON1 0X0B
#define WK2XXX_XOFF1 0X0C
#define WK2XXX_SADR 0X0D
#define WK2XXX_SAEN 0X0E
#define WK2XXX_RTSDLY 0X0F
//WK串口擴展芯片的寄存器的位定義
//wkxxx register bit defines
// GENA
#define WK2XXX_UT4EN 0x08
#define WK2XXX_UT3EN 0x04
#define WK2XXX_UT2EN 0x02
#define WK2XXX_UT1EN 0x01
//GRST
#define WK2XXX_UT4SLEEP 0x80
#define WK2XXX_UT3SLEEP 0x40
#define WK2XXX_UT2SLEEP 0x20
#define WK2XXX_UT1SLEEP 0x10
#define WK2XXX_UT4RST 0x08
#define WK2XXX_UT3RST 0x04
#define WK2XXX_UT2RST 0x02
#define WK2XXX_UT1RST 0x01
//GIER
#define WK2XXX_UT4IE 0x08
#define WK2XXX_UT3IE 0x04
#define WK2XXX_UT2IE 0x02
#define WK2XXX_UT1IE 0x01
//GIFR
#define WK2XXX_UT4INT 0x08
#define WK2XXX_UT3INT 0x04
#define WK2XXX_UT2INT 0x02
#define WK2XXX_UT1INT 0x01
//SPAGE
#define WK2XXX_SPAGE0 0x00
#define WK2XXX_SPAGE1 0x01
//SCR
#define WK2XXX_SLEEPEN 0x04
#define WK2XXX_TXEN 0x02
#define WK2XXX_RXEN 0x01
//LCR
#define WK2XXX_BREAK 0x20
#define WK2XXX_IREN 0x10
#define WK2XXX_PAEN 0x08
#define WK2XXX_PAM1 0x04
#define WK2XXX_PAM0 0x02
#define WK2XXX_STPL 0x01
//FCR
//SIER
#define WK2XXX_FERR_IEN 0x80
#define WK2XXX_CTS_IEN 0x40
#define WK2XXX_RTS_IEN 0x20
#define WK2XXX_XOFF_IEN 0x10
#define WK2XXX_TFEMPTY_IEN 0x08
#define WK2XXX_TFTRIG_IEN 0x04
#define WK2XXX_RXOUT_IEN 0x02
#define WK2XXX_RFTRIG_IEN 0x01
//SIFR
#define WK2XXX_FERR_INT 0x80
#define WK2XXX_CTS_INT 0x40
#define WK2XXX_RTS_INT 0x20
#define WK2XXX_XOFF_INT 0x10
#define WK2XXX_TFEMPTY_INT 0x08
#define WK2XXX_TFTRIG_INT 0x04
#define WK2XXX_RXOVT_INT 0x02
#define WK2XXX_RFTRIG_INT 0x01
//TFCNT
//RFCNT
//FSR
#define WK2XXX_RFOE 0x80
#define WK2XXX_RFBI 0x40
#define WK2XXX_RFFE 0x20
#define WK2XXX_RFPE 0x10
#define WK2XXX_RDAT 0x08
#define WK2XXX_TDAT 0x04
#define WK2XXX_TFULL 0x02
#define WK2XXX_TBUSY 0x01
//LSR
#define WK2XXX_OE 0x08
#define WK2XXX_BI 0x04
#define WK2XXX_FE 0x02
#define WK2XXX_PE 0x01
//FWCR
//RS485
/////函數部分
void WK_RstInit(void);
void WkWriteGReg(unsigned char greg,unsigned char dat);
u8 WkReadGReg(unsigned char greg);
void WkWriteSReg(u8 port,u8 sreg,u8 dat);
u8 WkReadSReg(u8 port,u8 sreg);
void WkWriteSFifo(u8 port,u8 *dat,u8 num);
void WkReadSFifo(u8 port,u8 *rec,u8 num);
void Wk_BaudAdaptive(void);
void Wk_Init(u8 port);
void Wk_DeInit(u8 port);
uint8_t Wk_SetBaud(u8 port,uint32_t baudrate);
int wk_TxLen(u8 port);
void wk_TxChars(u8 port,int len,u8 *sendbuf);
int wk_RxChars(u8 port,u8 *recbuf);
#endif
/////////////////
#include "wk2xxx.h"
#include "delay.h"
#include "usart.h"
/**************************************Wk2114WriteReg***********************************/
//函數功能:寫寄存器函數(前提是該寄存器可寫,某些寄存器如果你寫1,可能會自動置1,具體見數據手冊)
//參數:port:為子串口的數(C0C1)
// reg:為寄存器的地址(A3A2A1A0)
// dat:為寫入寄存器的數據
//注意:在子串口被打通的情況下,向FDAT寫入的數據會通過TX引腳輸出
//*************************************************************************/
void Wk2114WriteReg(unsigned char port,unsigned char reg,unsigned char dat)
{
uart_sendByte(((port-1)<<4)+reg); //寫指令,對于指令的構成見數據手冊
uart_sendByte(dat);//寫數據
}
/*************************************Wk2114ReadReg************************************/
//函數功能:讀寄存器函數
//參數:port:為子串口的數(C0C1)
// reg:為寄存器的地址(A3A2A1A0)
// rec_data:為讀取到的寄存器值
//注意:在子串口被打通的情況下,讀FDAT,實際上就是讀取uart的rx接收的數據
/*************************************************************************/
unsigned char Wk2114ReadReg(unsigned char port,unsigned char reg)
{
unsigned char rec_data;
uart_sendByte(0x40+((port-1)<<4)+reg); //寫指令,對于指令的構成見數據手冊
rec_data=uart_recByte(); //接收返回的寄存器值
return rec_data;
}
/**************************************Wk2114writeFIFO***********************************/
//函數功能:寫FIFO函數(該函數寫入的數據會通過uart的TX發(fā)送出去)
//參數:port:為子串口的數(C0C1)
// *dat:為寫入數據指針
// num:為寫入數據的個數,不超過16個字節(jié)(N3N2N1N0)
/*************************************************************************/
//void Wk2114writeFIFO(unsigned char port,unsigned char *send_da,unsigned char num)
//{
// unsigned char i;
// uart_sendByte(0x80+((port-1)<<4)+(num-1)); //寫指令,對于指令構成見數據手冊
// for(i=0;i<num;i++)
// {
// uart_sendByte( *(send_da+i));//寫數據
// }
//}
/***************************************Wk2114readFIFO**********************************/
//函數功能:讀FIFO函數(該函數讀取的數據是FIFO緩存中的數據,實際上是uart的rx接收的數據)
//參數:port:為子串口的數(C0C1)
// *dat:為讀到數據指針
// num:為讀出數據的個數,不超過16個字節(jié)(N3N2N1N0)
/*************************************************************************/
//unsigned char *Wk2114readFIFO(unsigned char port,unsigned char num)
//{
// unsigned char n;
// unsigned char dat[256];
// uart_sendByte(0xc0+((port-1)<<4)+(num-1));
// for(n=0;n<num;n++)
// {
// dat[n]=uart_recByte();
// }
// return dat;
//}
/******************************Wk2114Init*******************************************/
//函數功能:本函數主要會初始化一些芯片基本寄存器;
/*********************************************************************************/
void Wk2114Init(unsigned char port)
{
unsigned char gena,grst,gier,sier,scr;
//使能子串口時鐘
gena=Wk2114ReadReg(WK2XXX_GPORT,WK2XXX_GENA);
switch (port)
{
case 1://使能子串口1的時鐘
gena|=WK2XXX_UT1EN;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
break;
case 2://使能子串口2的時鐘
gena|=WK2XXX_UT2EN;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
break;
case 3://使能子串口3的時鐘
gena|=WK2XXX_UT3EN;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
break;
case 4://使能子串口4的時鐘
gena|=WK2XXX_UT4EN;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
break;
}
//軟件復位子串口
grst=Wk2114ReadReg(WK2XXX_GPORT,WK2XXX_GRST);
switch (port)
{
case 1://軟件復位子串口1
grst|=WK2XXX_UT1RST;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
case 2://軟件復位子串口2
grst|=WK2XXX_UT2RST;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
case 3://軟件復位子串口3
grst|=WK2XXX_UT3RST;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
case 4://軟件復位子串口4
grst|=WK2XXX_UT4RST;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
}
//使能子串口中斷,包括子串口總中斷和子串口內部的接收中斷,和設置中斷觸點
gier=Wk2114ReadReg(WK2XXX_GPORT,WK2XXX_GIER);
switch (port)
{
case 1://軟件復位子串口1
gier|=WK2XXX_UT1RST;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GIER,gier);
break;
case 2://軟件復位子串口2
gier|=WK2XXX_UT2RST;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GIER,gier);
break;
case 3://軟件復位子串口3
gier|=WK2XXX_UT3RST;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GIER,gier);
break;
case 4://軟件復位子串口4
gier|=WK2XXX_UT4RST;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GIER,gier);
break;
}
//使能子串口接收觸點中斷和超時中斷
sier=Wk2114ReadReg(port,WK2XXX_SIER);
sier |= WK2XXX_RFTRIG_IEN|WK2XXX_RXOUT_IEN;
Wk2114WriteReg(port,WK2XXX_SIER,sier);
// 初始化FIFO和設置固定中斷觸點
Wk2114WriteReg(port,WK2XXX_FCR,0XFF);
//設置任意中斷觸點,如果下面的設置有效,那么上面FCR寄存器中斷的固定中斷觸點將失效
Wk2114WriteReg(port,WK2XXX_SPAGE,1);//切換到page1
Wk2114WriteReg(port,WK2XXX_RFTL,0X40);//設置接收觸點為64個字節(jié)
Wk2114WriteReg(port,WK2XXX_TFTL,0X10);//設置發(fā)送觸點為16個字節(jié)
Wk2114WriteReg(port,WK2XXX_SPAGE,0);//切換到page0
//使能子串口的發(fā)送和接收使能
scr=Wk2114ReadReg(port,WK2XXX_SCR);
scr|=WK2XXX_TXEN|WK2XXX_RXEN;
Wk2114WriteReg(port,WK2XXX_SCR,scr);
}
/******************************Wk2114Close*******************************************/
//函數功能:本函數會關閉當前子串口,和復位初始值;
/*********************************************************************************/
void Wk2114Close(unsigned char port)
{
unsigned char gena,grst;
//復位子串口
grst=Wk2114ReadReg(WK2XXX_GPORT,WK2XXX_GRST);
switch (port)
{
case 1://軟件復位子串口1
grst&=~WK2XXX_UT1RST;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
case 2://軟件復位子串口2
grst&=~WK2XXX_UT2RST;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
case 3://軟件復位子串口3
grst&=~WK2XXX_UT3RST;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
case 4://軟件復位子串口4
grst&=~WK2XXX_UT4RST;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GRST,grst);
break;
}
//關閉子串口時鐘
gena=Wk2114ReadReg(WK2XXX_GPORT,WK2XXX_GENA);
switch (port)
{
case 1://使能子串口1的時鐘
gena&=~WK2XXX_UT1EN;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
break;
case 2://使能子串口2的時鐘
gena&=~WK2XXX_UT2EN;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
break;
case 3://使能子串口3的時鐘
gena&=~WK2XXX_UT3EN;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
break;
case 4://使能子串口4的時鐘
gena&=~WK2XXX_UT4EN;
Wk2114WriteReg(WK2XXX_GPORT,WK2XXX_GENA,gena);
break;
}
}
/**************************Wk2114SetBaud*******************************************************/
//函數功能:設置子串口波特率函數、此函數中波特率的匹配值是根據11.0592Mhz下的外部晶振計算的
// port:子串口號
// baud:波特率大小.波特率表示方式,
//
/**************************Wk2114SetBaud*******************************************************/
void Wk2114SetBaud(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;
}
//關掉子串口收發(fā)使能
scr=Wk2114ReadReg(port,WK2XXX_SCR);
Wk2114WriteReg(port,WK2XXX_SCR,0);
//設置波特率相關寄存器
Wk2114WriteReg(port,WK2XXX_SPAGE,1);//切換到page1
Wk2114WriteReg(port,WK2XXX_BAUD1,baud1);
Wk2114WriteReg(port,WK2XXX_BAUD0,baud0);
Wk2114WriteReg(port,WK2XXX_PRES,pres);
Wk2114WriteReg(port,WK2XXX_SPAGE,0);//切換到page0
//使能子串口收發(fā)使能
Wk2114WriteReg(port,WK2XXX_SCR,scr);
}
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "wk2xxx.h"
#include "wk2xxx_test.h"
#include "exti.h"
/*
UART2為打印接口:TX2:PA2; RX2:PA3
UART1為主uart接口:TX1:PA9;RX1:PA10
RSTN:PB8
*/
void EXTI1_IRQHandler(void)
{
u8 gifr,rxbuf[256];
int rxlen;
printf("IN EXTI1_IRQ!!!!\n");
/*關閉LED燈*/
LED1(LED_OFF);
LED2(LED_OFF);
LED3(LED_OFF);
LED4(LED_OFF);
if(EXTI_GetFlagStatus(EXTI_Line1)!= RESET)
{ EXTI_ClearITPendingBit(EXTI_Line1); //清除LINE1上的中斷標志位
gifr=WkReadGReg(WK2XXX_GIFR);/**/
do{
if(gifr&WK2XXX_UT1INT)//判斷子串口1是否有中斷
{ /*數據處理*/
/*數據接收*/
rxlen=wk_RxChars(1,rxbuf);//一次接收的數據不會超過256Byte
/*數據發(fā)送*/
//把接收的數據發(fā)送出去
wk_TxChars(1,rxlen,rxbuf);
}
if(gifr&WK2XXX_UT2INT)//判斷子串口2是否有中斷
{
/*數據接收*/
rxlen=wk_RxChars(2,rxbuf);//一次接收的數據不會超過256Byte
/*數據發(fā)送*/
//把接收的數據發(fā)送出去
wk_TxChars(2,rxlen,rxbuf);
}
if(gifr&WK2XXX_UT3INT)//判斷子串口3是否有中斷
{
/*數據接收*/
rxlen=wk_RxChars(3,rxbuf);//一次接收的數據不會超過256Byte
/*數據發(fā)送*/
//把接收的數據發(fā)送出去
wk_TxChars(3,rxlen,rxbuf);
// printf("port!!!!\n");
}
if(gifr&WK2XXX_UT4INT)//判斷子串口4是否有中斷
{
/*數據接收*/
rxlen=wk_RxChars(4,rxbuf);//一次接收的數據不會超過256Byte
/*數據發(fā)送*/
//把接收的數據發(fā)送出去
//wk_TxChars(4,rxlen,rxbuf);
}
gifr=WkReadGReg(WK2XXX_GIFR);
//printf("IN EXTI2_IRQ GIFR:0X%X !!!\n",gifr);
}while(gifr&0x0f);
printf("IN EXTI1_IRQ over! !!!\n");
}
}
int main(void)
{
unsigned char dat1;
int n,len;
unsigned char sendbuf[256];
for(n=0;n<256;n++)
sendbuf[n]=n;
//配置stm32串口相關
delay_init(); //延時函數初始化
NVIC_Configuration(); //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
uart_init(115200); //串口初始化為115200
uart2_init(115200);
WK_RstInit();
printf("WK_UART_DEMO_V1.0.\n");
dat1=0xff;
Wk_BaudAdaptive();
delay_ms(100);
/*讀寫GNEA,測試主接口通信是否成功*/
dat1=WkReadGReg(WK2XXX_GENA);
printf("gena=0x%x.\n",dat1);
///////////////////////////////////////////////
//初始化串口。
Wk_Init(1);
Wk_Init(2);
Wk_Init(3);
Wk_Init(4);
//設置子串口波特率。
Wk_SetBaud(1,115200);
Wk_SetBaud(2,115200);
Wk_SetBaud(3,115200);
Wk_SetBaud(4,115200);
EXTIX_Init();//初始化CPU外部中斷
while(1)
{
Exti_Disable();/*關閉外部中斷響應*/
// /*中斷屏蔽區(qū),這樣可以防止中斷響應打亂spi的操作時序*/
// /*通常在中斷函數外部操作讀寫寄存器的時候,最好關斷中斷響應,但是這個時間也不要過長,過長導致子串口溢出,從而導致數據丟失*/
// /*如果對于大數據需要發(fā)送,一次操作不要超過256,最好不要讓程序阻塞在發(fā)送中*/
len=wk_TxLen(4);/*判斷子串口4能寫入數據的個數*/
wk_TxChars(4,len,sendbuf);/*寫入len個數據進入發(fā)送fifo*/
Exti_Enable();/*開啟外部中斷響應*/
}
}
Keil代碼下載與相關資料下載:
WK2124 Resources V1.1.7z
(3.9 MB, 下載次數: 43)
2022-9-14 14:16 上傳
點擊文件名下載附件
串口擴展芯片 下載積分: 黑幣 -5
|