|
/***********************************************************************
文件名稱:main.C
功 能:
編寫時間:
編 寫 人:
注 意:
***********************************************************************/
#include "main.h"
#include "wk2xxx.h"
#include "wk2xxx_test.h"
//#include "sdcard.h"
//#include "ff.h"
//#include "LCD.h"
//#include "MM1_240.h"
//#include "MM3_240.h"
/*
目前stm32和WK2XXX 硬件連接關(guān)系
復(fù)位RST:PB8
cs:PA4
clk:PA5
mosi:PA7
miso:PA6
*/
void EXTI9_5_IRQHandler (void)
{
u8 gifr,rxbuf[256];
int rxlen;
printf("IN EXTI2_IRQ!!!!\n");
/*關(guān)閉LED燈*/
// LED1(LED_OFF);
// LED2(LED_OFF);
// LED3(LED_OFF);
// LED4(LED_OFF);
if(EXTI_GetFlagStatus(EXTI_Line9)!= RESET)
{ EXTI_ClearITPendingBit(EXTI_Line9); //清除LINE1上的中斷標(biāo)志位
gifr=WkReadGReg(WK2XXX_GIFR);/**/
do{
if(gifr&WK2XXX_UT1INT)//判斷子串口1是否有中斷
{ /*數(shù)據(jù)處理*/
/*數(shù)據(jù)接收*/
rxlen=wk_RxChars(1,rxbuf);//一次接收的數(shù)據(jù)不會超過256Byte
/*數(shù)據(jù)發(fā)送*/
//把接收的數(shù)據(jù)發(fā)送出去
wk_TxChars(1,rxlen,rxbuf);
}
if(gifr&WK2XXX_UT2INT)//判斷子串口2是否有中斷
{
/*數(shù)據(jù)接收*/
rxlen=wk_RxChars(2,rxbuf);//一次接收的數(shù)據(jù)不會超過256Byte
/*數(shù)據(jù)發(fā)送*/
//把接收的數(shù)據(jù)發(fā)送出去
wk_TxChars(2,rxlen,rxbuf);
}
if(gifr&WK2XXX_UT3INT)//判斷子串口3是否有中斷
{
/*數(shù)據(jù)接收*/
rxlen=wk_RxChars(3,rxbuf);//一次接收的數(shù)據(jù)不會超過256Byte
/*數(shù)據(jù)發(fā)送*/
//把接收的數(shù)據(jù)發(fā)送出去
wk_TxChars(3,rxlen,rxbuf);
// printf("port!!!!\n");
}
if(gifr&WK2XXX_UT4INT)//判斷子串口4是否有中斷
{
/*數(shù)據(jù)接收*/
rxlen=wk_RxChars(4,rxbuf);//一次接收的數(shù)據(jù)不會超過256Byte
/*數(shù)據(jù)發(fā)送*/
//把接收的數(shù)據(jù)發(fā)送出去
//wk_TxChars(4,rxlen,rxbuf);
}
gifr=WkReadGReg(WK2XXX_GIFR);
//printf("IN EXTI2_IRQ GIFR:0X%X !!!\n",gifr);
}while(gifr&0x0f);
printf("IN EXTI2_IRQ over! !!!\n");
}
}
int main(void)
{
//wk2xxx相關(guān)定義
unsigned char dat1,sendbuf[256]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x12};
unsigned char tmp_buf[1];
/*
ST固件庫中的啟動文件已經(jīng)執(zhí)行了 SystemInit() 函數(shù),該函數(shù)在 system_stm32f4xx.c 文件,主要功能是
配置CPU系統(tǒng)的時鐘,內(nèi)部Flash訪問時序,配置FSMC用于外部SRAM等。
*/
SysTick_Configuration(); //延時初始化
USART_Configuration();
// Key_Configuration();
// LED_Configuration();
// SPI1_Init( ) ;
WK_SPI_Init();//初始化SPI總線
/*讀寫GNEA,測試主接口通信是否成功*/
dat1=WkReadGReg(WK2XXX_GENA);
printf("gena=0x%x.\n",dat1);
/*硬件復(fù)位芯片*/
WK_RstInit();
/*初始化子串口*/
Wk_Init(1);
Wk_Init(2);
Wk_Init(3);
Wk_Init(4);
/*設(shè)置子串口波特率*/
Wk_SetBaud(1,115200);
Wk_SetBaud(2,115200);
Wk_SetBaud(3,115200);
Wk_SetBaud(4,115200);
/*使能485*/
//WK_RS485(1);
//WK_RS485(2);
//WK_RS485(3);
//WK_RS485(4);
EXTIX_Init();//初始化CPU外部中斷
while(1)
{
delay_ms(1000);
Exti_Disable();/*關(guān)閉外部中斷響應(yīng)*/
/*中斷屏蔽區(qū),這樣可以防止中斷響應(yīng)打亂spi的操作時序*/
/*通常在中斷函數(shù)外部操作讀寫寄存器的時候,最好關(guān)斷中斷響應(yīng),但是這個時間也不要過長,過長導(dǎo)致子串口溢出,從而導(dǎo)致數(shù)據(jù)丟失*/
/*如果對于大數(shù)據(jù)需要發(fā)送,一次操作不要超過256,最好不要讓程序阻塞在發(fā)送中*/
//len=wk_TxLen(4);/*判斷子串口4能寫入數(shù)據(jù)的個數(shù)*/
//wk_TxChars(4,len,sendbuf);/*寫入len個數(shù)據(jù)進(jìn)入發(fā)送fifo*/
WkWriteSFifo(1,sendbuf,10);
Exti_Enable();/*開啟外部中斷響應(yīng)*/
//wk_TxChars(1,10,"0123456789");
wk_test1(2);
}
}
#include "spi.h"
#include "stm32f4xx.h"
SPI_InitTypeDef SPI_InitStructure;
//串行外設(shè)接口SPI的初始化,SPI配置成主模式
//本例程選用SPI1對NRF24L01進(jìn)行讀寫操作,先對SPI1進(jìn)行初始化
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//打開所用GPIO的時鐘
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能GPIOA時鐘
//配置的IO是PB12 PB13 PB15,SPI的CS CLK MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; //管腳SPI復(fù)用 (<STM32F4為>PA5:SPI1_SCK,PA6:SPI1_MISO,PA7:SPI1_MOSI)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置的IO是PA6,SPI的MISO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**************************************************************************************
* 描 述 : 模擬SPI寫入一個字節(jié)
* 入 參 : uint8_t date
* 返回值 :
**************************************************************************************/
void SPI_WriteByte(uint8_t date)
{
uint8_t temp,i;
temp = date;
for (i = 0; i < 8; i++)
{
SPI_SCLK(0);
if((temp&0x80)==0x80)
{ SPI_MOSI(1); }
else
{ SPI_MOSI(0); }
SPI_SCLK(1) ;
temp <<= 1;
}
SPI_SCLK(0);
SPI_MOSI(0);
}
/**************************************************************************************
* 描 述 : 模擬SPI讀取一個字節(jié)
* 入 參 : 無
* 返回值 : 讀取uint8_t數(shù)據(jù)
**************************************************************************************/
uint8_t SPI_ReadByte(void)
{
uint8_t temp=0;
uint8_t i,SDI;
SPI_SCLK(0) ;
for(i = 0; i < 8; i++)
{
temp <<= 1;
SPI_SCLK(1) ;
SDI = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6); //MISO接收數(shù)據(jù)
if(SDI)
{temp++; }
SPI_SCLK(0) ;
}
SPI_SCLK(0) ;
return(temp);
}
void SPI1_SetSpeed(u8 SpeedSet)
{
// SPI_InitStructure.SPI_BaudRatePrescaler = SpeedSet ;
// SPI_Init(SPI1, &SPI_InitStructure);
// SPI_Cmd(SPI1,ENABLE);
}
/*************************************************************************/
//函數(shù)功能:初始化SPI片選信號CS,并把CS的默認(rèn)狀態(tài)設(shè)置為高電平
//
//
/*************************************************************************/
void SPI_CS_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = SPI1_CS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init( GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIO_SPI1,SPI1_CS);
}
/*************************************************************************/
//函數(shù)功能:初始化SPI總線,設(shè)置SPI總線為0模式
/*************************************************************************/
void SPI_BUS_Init(void)
{
SPI1_Init( ); //初始化SPI
SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //設(shè)置為10M時鐘,高速模式
}
/*************************************************************************/
//函數(shù)功能:設(shè)置CS信號為高電平
/*************************************************************************/
void SPI_CS_H(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
}
/*************************************************************************/
//函數(shù)功能:設(shè)置CS信號為低電平
/*************************************************************************/
void SPI_CS_L(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
}
/*************************************************************************/
//函數(shù)功能:初始化SPI接口
/*************************************************************************/
void WK_SPI_Init(void)
{
SPI_CS_Init();
SPI_BUS_Init();
}
//u8 SPI1_ReadWriteByte(u8 TxData) //SPI讀寫數(shù)據(jù)函數(shù)
//{
// u8 retry=0;
// /* Loop while DR register in not emplty */
// while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //發(fā)送緩存標(biāo)志位為空
// {
// retry++;
// if(retry>200)return 0;
// }
// /* Send byte through the SPI1 peripheral */
// SPI_I2S_SendData(SPI1, TxData); //通過外設(shè)SPI1發(fā)送一個數(shù)據(jù)
// retry=0;
// /* Wait to receive a byte */
// while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //接收緩存標(biāo)志位不為空
// {
// retry++;
// if(retry>200)return 0;
// }
// /* Return the byte read from the SPI bus */
// return SPI_I2S_ReceiveData(SPI1); //通過SPI1返回接收數(shù)據(jù)
//}
#include "wk2xxx.h"
#include "delay.h"
#include "spi.h"
#include "sys.h"
#include "SCI.h"
#include "wk2xxx_test.h"
#include "exti.h"
/**************************************WK_RstInit***********************************/
//函數(shù)功能:wk芯片需要用MCU的GPIO去控制RST引腳,本函數(shù)通過stm32的PB.8引腳連接WK的RST引腳
//初始化STM32的PB8引腳。
//
//*************************************************************************/
void WK_RstInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PB.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOB.8
GPIO_SetBits(GPIOA,GPIO_Pin_8); //PB.8 輸出高
delay_ms(50);
GPIO_ResetBits(GPIOA,GPIO_Pin_8); //PB.8 輸出低
delay_ms(10);
GPIO_SetBits(GPIOA,GPIO_Pin_8); //PB.8 輸出高
delay_ms(10);
}
/***************************WkWriteGReg***********************************/
//函數(shù)功能:寫全局寄存器函數(shù)(前提是該寄存器可寫,
//某些寄存器如果你寫1,可能會自動置1,具體見數(shù)據(jù)手冊)
//參數(shù):
// greg:為全局寄存器的地址
// dat:為寫入寄存器的數(shù)據(jù)
//***********************************************************************/
void WkWriteGReg(unsigned char greg,unsigned char dat)
{ u8 cmd;
cmd=0|greg;
SPI_CS_L();//拉低cs信號
SPI_WriteByte(cmd); //寫指令,對于指令的構(gòu)成見數(shù)據(jù)手冊
SPI_WriteByte(dat);//寫數(shù)據(jù)
SPI_CS_H();//拉高cs信號
}
/****************************WkReadGReg***********************************/
//函數(shù)功能:讀全局寄存器
//參數(shù):
// greg:為全局寄存器的地址
// rec:返回的寄存器值
//***********************************************************************/
u8 WkReadGReg(unsigned char greg)
{ u8 cmd,rec;
cmd=0x40|greg;
SPI_CS_L();//拉低cs信號
SPI_WriteByte(cmd); //寫指令,對于指令的構(gòu)成見數(shù)據(jù)手冊
rec=SPI_ReadByte();//寫數(shù)據(jù)
SPI_CS_H();//拉高cs信號
return rec;
}
/**************************WkWriteSReg***********************************/
//函數(shù)功能:
//參數(shù):port:為子串口
// sreg:為子串口寄存器
// dat:為寫入寄存器的數(shù)據(jù)
//注意:在子串口被打通的情況下,向FDAT寫入的數(shù)據(jù)會通過TX引腳輸出
//**********************************************************************/
void WkWriteSReg(u8 port,u8 sreg,u8 dat)
{ u8 cmd;
cmd=0x0|((port-1)<<4)|sreg;
SPI_CS_L();//拉低cs信號
SPI_WriteByte(cmd); //寫指令,對于指令的構(gòu)成見數(shù)據(jù)手冊
SPI_WriteByte(dat);//寫數(shù)據(jù)
SPI_CS_H();//拉高cs信號
}
/**************************WkReadSReg***********************************/
//函數(shù)功能:讀子串口寄存器
//參數(shù):port為子串口端口號
// sreg:為子串口寄存器地址
// rec:返回的寄存器值
//**********************************************************************/
u8 WkReadSReg(u8 port,u8 sreg)
{ u8 cmd,rec;
cmd=0x40|((port-1)<<4)|sreg;
SPI_CS_L();//拉低cs信號
SPI_WriteByte(cmd); //寫指令,對于指令的構(gòu)成見數(shù)據(jù)手冊
rec=SPI_ReadByte();//寫數(shù)據(jù)
SPI_CS_H(); //拉高cs信號
return rec;
}
/************************WkWriteSFifo***********************************/
//函數(shù)功能:向子串口fifo寫入需要發(fā)送的數(shù)據(jù)
//參數(shù):port:為子串口
// *dat:寫入數(shù)據(jù)
// num:為寫入數(shù)據(jù)的個數(shù),單次不超過256
//注意:通過該方式寫入的數(shù)據(jù),被直接寫入子串口的緩存FIFO,然后被發(fā)送
//*********************************************************************/
void WkWriteSFifo(u8 port,u8 *dat,int num)
{
u8 cmd;
int i;
cmd=0x80|((port-1)<<4);
if(num>0)
{
SPI_CS_L();//拉低cs信號
SPI_WriteByte(cmd); //寫指令,對于指令構(gòu)成見數(shù)據(jù)手冊
for(i=0;i<num;i++)
{
SPI_WriteByte( *(dat+i));//寫數(shù)據(jù)
}
SPI_CS_H();//拉高cs信號
}
}
/************************WkReadSFifo***********************************/
//函數(shù)功能:從子串口的fifo中讀出接收到的數(shù)據(jù)
//參數(shù):port:為子串口
// *rec:接收到的數(shù)據(jù)
// num:讀出的數(shù)據(jù)個數(shù)。
//注意:通過該方式讀出子串口緩存中的數(shù)據(jù)。單次不能超過256
//*********************************************************************/
void WkReadSFifo(u8 port,u8 *rec,int num)
{
u8 cmd;
int n;
cmd=0xc0|((port-1)<<4);
if(num>0)
{
SPI_CS_L();//拉低cs信號
SPI_WriteByte(cmd);
for(n=0;n<num;n++)
{
*(rec+n)= SPI_ReadByte();
}
SPI_CS_H();//拉高cs信號
}
}
/*******WkInit*******************************************/
//函數(shù)功能:初始化子串口
/*******************************************************/
void Wk_Init(u8 port)
{
u8 gena,grst,gier,sier,scr;
//使能子串口時鐘
gena=WkReadGReg(WK2XXX_GENA);
gena=gena|(1<<(port-1));
WkWriteGReg(WK2XXX_GENA,gena);
//軟件復(fù)位子串口
grst=WkReadGReg(WK2XXX_GRST);
grst=grst|(1<<(port-1));
WkWriteGReg(WK2XXX_GRST,grst);
//使能串口總中斷
gier=WkReadGReg(WK2XXX_GIER);
gier=gier|(1<<(port-1));
WkWriteGReg(WK2XXX_GIER,gier);
//使能子串口接收觸點(diǎn)中斷和超時中斷
sier=WkReadSReg(port,WK2XXX_SIER);
sier |= WK2XXX_RFTRIG_IEN|WK2XXX_RXOUT_IEN;
WkWriteSReg(port,WK2XXX_SIER,sier);
//初始化FIFO和設(shè)置固定中斷觸點(diǎn)
WkWriteSReg(port,WK2XXX_FCR,0XFF);
//設(shè)置任意中斷觸點(diǎn),如果下面的設(shè)置有效,
//那么上面FCR寄存器中斷的固定中斷觸點(diǎn)將失效
WkWriteSReg(port,WK2XXX_SPAGE,1);//切換到page1
WkWriteSReg(port,WK2XXX_RFTL,0X40);//設(shè)置接收觸點(diǎn)為64個字節(jié)
WkWriteSReg(port,WK2XXX_TFTL,0X10);//設(shè)置發(fā)送觸點(diǎn)為16個字節(jié)
WkWriteSReg(port,WK2XXX_SPAGE,0);//切換到page0
//使能子串口的發(fā)送和接收使能
scr=WkReadSReg(port,WK2XXX_SCR);
scr|=WK2XXX_TXEN|WK2XXX_RXEN;
WkWriteSReg(port,WK2XXX_SCR,scr);
}
/******************************Wk_DeInit*******************************************/
//函數(shù)功能:初始化子串口
/*********************************************************************************/
void Wk_DeInit(u8 port)
{
u8 gena,grst,gier;
//關(guān)閉子串口總時鐘
gena=WkReadGReg(WK2XXX_GENA);
gena=gena&(~(1<<(port-1)));
WkWriteGReg(WK2XXX_GENA,gena);
//使能子串口總中斷
gier=WkReadGReg(WK2XXX_GIER);
gier=gier&(~(1<<(port-1)));
WkWriteGReg(WK2XXX_GIER,gier);
//軟件復(fù)位子串口
grst=WkReadGReg(WK2XXX_GRST);
grst=grst|(1<<(port-1));
WkWriteGReg(WK2XXX_GRST,grst);
}
/**************************Wk_SetBaud*******************************************************/
//函數(shù)功能:設(shè)置子串口波特率函數(shù)、此函數(shù)中波特率的匹配值是根據(jù)11.0592Mhz下的外部晶振計算的
// port:子串口號
// baud:波特率大小.波特率表示方式,
/**************************Wk2114SetBaud*******************************************************/
uint8_t Wk_SetBaud(u8 port,uint32_t baudrate)
{
uint32_t temp,freq;
uint8_t scr;
uint8_t baud1,baud0,pres;
freq=11059200;/*芯片外部時鐘頻率*/
// freq=32000000;/*芯片外部時鐘頻率*/
if(freq>=(baudrate*16))
{
temp=(freq)/(baudrate*16);
temp=temp-1;
baud1=(uint8_t)((temp>>8)&0xff);
baud0=(uint8_t)(temp&0xff);
temp=(((freq%(baudrate*16))*100)/(baudrate));
pres=(temp+100/2)/100;
printf("Wk_SetBaud---freq:%d,baudrate:%d\n",freq,baudrate);
printf("Wk_SetBaud---baud1:%x,baud0:%x,pres:%x\n",baud1,baud0,pres);
//關(guān)掉子串口收發(fā)使能
scr=WkReadSReg(port,WK2XXX_SCR);
WkWriteSReg(port,WK2XXX_SCR,0);
//設(shè)置波特率相關(guān)寄存器
WkWriteSReg(port,WK2XXX_SPAGE,1);//切換到page1
WkWriteSReg(port,WK2XXX_BAUD1,baud1);
WkWriteSReg(port,WK2XXX_BAUD0,baud0);
WkWriteSReg(port,WK2XXX_PRES,pres);
WkWriteSReg(port,WK2XXX_SPAGE,0);//切換到page0
//使能子串口收發(fā)使能
WkWriteSReg(port,WK2XXX_SCR,scr);
return 0;
}
else
{
printf("Wk_SetBaud error!。!\n");
return 1;
}
}
/**************************WK_TxLen*******************************************/
//函數(shù)功能:獲取子串口發(fā)送FIFO剩余空間長度
// port:端口號
// 返回值:發(fā)送FIFO剩余空間長度
/**************************WK_Len********************************************/
int wk_TxLen(u8 port)
{
u8 fsr,tfcnt;
int len=0;
fsr =WkReadSReg(port,WK2XXX_FSR);
tfcnt=WkReadSReg(port,WK2XXX_TFCNT);
if(fsr& WK2XXX_TFULL)
{ len=0;}
else
{len=256-tfcnt;}
return len;
}
/**************************WK_TxChars*******************************************/
//函數(shù)功能:通過子串口發(fā)送固定長度數(shù)據(jù)
// port:端口號
// len:單次發(fā)送長度不超過256
//
/**************************WK_TxChars********************************************/
int wk_TxChars(u8 port,int len,u8 *sendbuf)
{
#if 1
WkWriteSFifo(port,sendbuf,len);//通過fifo方式發(fā)送數(shù)據(jù)
#else
int num=len;
for(num=0;num<len;num++)
{
WkWriteSReg(port,WK2XXX_FDAT,*(sendbuf+num));
}
#endif
}
/**************************WK_RxChars*******************************************/
//函數(shù)功能:讀取子串口fifo中的數(shù)據(jù)
// port:端口號
// recbuf:接收到的數(shù)據(jù)
// 返回值:接收數(shù)據(jù)的長度
/**************************WK_RxChars********************************************/
int wk_RxChars(u8 port,u8 *recbuf)
{
u8 fsr=0,rfcnt=0,rfcnt2=0,sifr=0;
int n,len=0;
sifr=WkReadSReg(port,WK2XXX_SIFR);
if((sifr&WK2XXX_RFTRIG_INT)||(sifr&WK2XXX_RXOVT_INT))//有接收中斷和接收超時中斷
{
fsr =WkReadSReg(port,WK2XXX_FSR);
rfcnt=WkReadSReg(port,WK2XXX_RFCNT);
rfcnt2=WkReadSReg(port,WK2XXX_RFCNT);
//printf("rfcnt=0x%x.\n",rfcnt);
/*判斷fifo中數(shù)據(jù)個數(shù)*/
if(fsr& WK2XXX_RDAT)
{
if(!(rfcnt2>=rfcnt))
{
rfcnt=rfcnt2;
}
len=(rfcnt==0)?256:rfcnt;
}
#if 1
WkReadSFifo(port,recbuf,len);
#else
for(n=0;n<len;n++)
*(recbuf+n)=WkReadSReg(port,WK2XXX_FDAT);
#endif
return len;
}
else
{
len=0;
return len;
}
}
/**************************WK_RS485*******************************************************/
//函數(shù)功能:設(shè)置子串口RS485的收發(fā)轉(zhuǎn)換函數(shù),使用RTS引腳控制485電平轉(zhuǎn)換芯片的收發(fā)
// port:子串口號
//
//注意:只有WK2168/WK2204支持該功能
/**************************WK_RS485*******************************************************/
void WK_RS485(u8 port)
{
WkWriteSReg(port,WK2XXX_RS485,0x02);//默認(rèn)高電平
//WkWriteSReg(port,WK2XXX_RS485,0x03);//默認(rèn)低電平
WkWriteSReg(port,WK2XXX_SPAGE,1);//切換到page1
WkWriteSReg(port,WK2XXX_RTSDLY,0X10);
WkWriteSReg(port,WK2XXX_SPAGE,0);//切換到page0
}
/**************************WK_RTSCTS*******************************************************/
//函數(shù)功能:硬件自動流量控制,需要子設(shè)備的支持
// port:子串口號
//
//注意:只有WK2168/WK2204支持該功能
/**************************WK_RTSCTS*******************************************************/
void WK_RTSCTS(u8 port)
{
WkWriteSReg(port,WK2XXX_FWCR,0x30);//
WkWriteSReg(port,WK2XXX_SPAGE,1);//切換到page1
WkWriteSReg(port,WK2XXX_FWTH,0XF0);//停止接收觸點(diǎn)
WkWriteSReg(port,WK2XXX_FWTL,0X20);//繼續(xù)接收觸點(diǎn)
WkWriteSReg(port,WK2XXX_SPAGE,0);//切換到page0
}
/**************************WK_IrqApp*******************************************/
//函數(shù)功能:中斷處理的一般流程,可以根據(jù)需要修改
//
//
//
/**************************WK_IrqApp********************************************/
//u8 WK_IrqApp(void)
//{
// u8 gifr,sier,sifr;
// gifr=WkReadGReg(WK2XXX_GIFR);
// if(gifr&WK2XXX_UT1INT)//判斷子串口1是否有中斷
// {
// sifr =WkReadSReg(1,WK2XXX_SIFR);
// if()
// }
// if(gifr&WK2XXX_UT2INT)//判斷子串口2是否有中斷
// {
//
// }
// if(gifr&WK2XXX_UT3INT)//判斷子串口3是否有中斷
// {
//
// }
// if(gifr&WK2XXX_UT4INT)//判斷子串口4是否有中斷
// {
//
// }
//
//
//}
程序運(yùn)行正常,將TX2與RX2短接,測試數(shù)據(jù)如下
#include "wk2xxx.h"
#include "delay.h"
#include "spi.h"
#include "sys.h"
#include "SCI.h"
#include "wk2xxx_test.h"
#include "exti.h"
/**************************************WK_RstInit***********************************/
//函數(shù)功能:wk芯片需要用MCU的GPIO去控制RST引腳,本函數(shù)通過stm32的PB.8引腳連接WK的RST引腳
//初始化STM32的PB8引腳。
//
//*************************************************************************/
void WK_RstInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PB.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOB.8
GPIO_SetBits(GPIOA,GPIO_Pin_8); //PB.8 輸出高
delay_ms(50);
GPIO_ResetBits(GPIOA,GPIO_Pin_8); //PB.8 輸出低
delay_ms(10);
GPIO_SetBits(GPIOA,GPIO_Pin_8); //PB.8 輸出高
delay_ms(10);
}
/***************************WkWriteGReg***********************************/
//函數(shù)功能:寫全局寄存器函數(shù)(前提是該寄存器可寫,
//某些寄存器如果你寫1,可能會自動置1,具體見數(shù)據(jù)手冊)
//參數(shù):
// greg:為全局寄存器的地址
// dat:為寫入寄存器的數(shù)據(jù)
//***********************************************************************/
void WkWriteGReg(unsigned char greg,unsigned char dat)
{ u8 cmd;
cmd=0|greg;
SPI_CS_L();//拉低cs信號
SPI_WriteByte(cmd); //寫指令,對于指令的構(gòu)成見數(shù)據(jù)手冊
SPI_WriteByte(dat);//寫數(shù)據(jù)
SPI_CS_H();//拉高cs信號
}
/****************************WkReadGReg***********************************/
//函數(shù)功能:讀全局寄存器
//參數(shù):
// greg:為全局寄存器的地址
// rec:返回的寄存器值
//***********************************************************************/
u8 WkReadGReg(unsigned char greg)
{ u8 cmd,rec;
cmd=0x40|greg;
SPI_CS_L();//拉低cs信號
SPI_WriteByte(cmd); //寫指令,對于指令的構(gòu)成見數(shù)據(jù)手冊
rec=SPI_ReadByte();//寫數(shù)據(jù)
SPI_CS_H();//拉高cs信號
return rec;
}
/**************************WkWriteSReg***********************************/
//函數(shù)功能:
//參數(shù):port:為子串口
// sreg:為子串口寄存器
// dat:為寫入寄存器的數(shù)據(jù)
//注意:在子串口被打通的情況下,向FDAT寫入的數(shù)據(jù)會通過TX引腳輸出
//**********************************************************************/
void WkWriteSReg(u8 port,u8 sreg,u8 dat)
{ u8 cmd;
cmd=0x0|((port-1)<<4)|sreg;
SPI_CS_L();//拉低cs信號
SPI_WriteByte(cmd); //寫指令,對于指令的構(gòu)成見數(shù)據(jù)手冊
SPI_WriteByte(dat);//寫數(shù)據(jù)
SPI_CS_H();//拉高cs信號
}
/**************************WkReadSReg***********************************/
//函數(shù)功能:讀子串口寄存器
//參數(shù):port為子串口端口號
// sreg:為子串口寄存器地址
// rec:返回的寄存器值
//**********************************************************************/
u8 WkReadSReg(u8 port,u8 sreg)
{ u8 cmd,rec;
cmd=0x40|((port-1)<<4)|sreg;
SPI_CS_L();//拉低cs信號
SPI_WriteByte(cmd); //寫指令,對于指令的構(gòu)成見數(shù)據(jù)手冊
rec=SPI_ReadByte();//寫數(shù)據(jù)
SPI_CS_H(); //拉高cs信號
return rec;
}
/************************WkWriteSFifo***********************************/
//函數(shù)功能:向子串口fifo寫入需要發(fā)送的數(shù)據(jù)
//參數(shù):port:為子串口
// *dat:寫入數(shù)據(jù)
// num:為寫入數(shù)據(jù)的個數(shù),單次不超過256
//注意:通過該方式寫入的數(shù)據(jù),被直接寫入子串口的緩存FIFO,然后被發(fā)送
//*********************************************************************/
void WkWriteSFifo(u8 port,u8 *dat,int num)
{
u8 cmd;
int i;
cmd=0x80|((port-1)<<4);
if(num>0)
{
SPI_CS_L();//拉低cs信號
SPI_WriteByte(cmd); //寫指令,對于指令構(gòu)成見數(shù)據(jù)手冊
for(i=0;i<num;i++)
{
SPI_WriteByte( *(dat+i));//寫數(shù)據(jù)
}
SPI_CS_H();//拉高cs信號
}
}
/************************WkReadSFifo***********************************/
//函數(shù)功能:從子串口的fifo中讀出接收到的數(shù)據(jù)
//參數(shù):port:為子串口
// *rec:接收到的數(shù)據(jù)
// num:讀出的數(shù)據(jù)個數(shù)。
//注意:通過該方式讀出子串口緩存中的數(shù)據(jù)。單次不能超過256
//*********************************************************************/
void WkReadSFifo(u8 port,u8 *rec,int num)
{
u8 cmd;
int n;
cmd=0xc0|((port-1)<<4);
if(num>0)
{
SPI_CS_L();//拉低cs信號
SPI_WriteByte(cmd);
for(n=0;n<num;n++)
{
*(rec+n)= SPI_ReadByte();
}
SPI_CS_H();//拉高cs信號
}
}
/*******WkInit*******************************************/
//函數(shù)功能:初始化子串口
/*******************************************************/
void Wk_Init(u8 port)
{
u8 gena,grst,gier,sier,scr;
//使能子串口時鐘
gena=WkReadGReg(WK2XXX_GENA);
gena=gena|(1<<(port-1));
WkWriteGReg(WK2XXX_GENA,gena);
//軟件復(fù)位子串口
grst=WkReadGReg(WK2XXX_GRST);
grst=grst|(1<<(port-1));
WkWriteGReg(WK2XXX_GRST,grst);
//使能串口總中斷
gier=WkReadGReg(WK2XXX_GIER);
gier=gier|(1<<(port-1));
WkWriteGReg(WK2XXX_GIER,gier);
//使能子串口接收觸點(diǎn)中斷和超時中斷
sier=WkReadSReg(port,WK2XXX_SIER);
sier |= WK2XXX_RFTRIG_IEN|WK2XXX_RXOUT_IEN;
WkWriteSReg(port,WK2XXX_SIER,sier);
//初始化FIFO和設(shè)置固定中斷觸點(diǎn)
WkWriteSReg(port,WK2XXX_FCR,0XFF);
//設(shè)置任意中斷觸點(diǎn),如果下面的設(shè)置有效,
//那么上面FCR寄存器中斷的固定中斷觸點(diǎn)將失效
WkWriteSReg(port,WK2XXX_SPAGE,1);//切換到page1
WkWriteSReg(port,WK2XXX_RFTL,0X40);//設(shè)置接收觸點(diǎn)為64個字節(jié)
WkWriteSReg(port,WK2XXX_TFTL,0X10);//設(shè)置發(fā)送觸點(diǎn)為16個字節(jié)
WkWriteSReg(port,WK2XXX_SPAGE,0);//切換到page0
//使能子串口的發(fā)送和接收使能
scr=WkReadSReg(port,WK2XXX_SCR);
scr|=WK2XXX_TXEN|WK2XXX_RXEN;
WkWriteSReg(port,WK2XXX_SCR,scr);
}
/******************************Wk_DeInit*******************************************/
//函數(shù)功能:初始化子串口
/*********************************************************************************/
void Wk_DeInit(u8 port)
{
u8 gena,grst,gier;
//關(guān)閉子串口總時鐘
gena=WkReadGReg(WK2XXX_GENA);
gena=gena&(~(1<<(port-1)));
WkWriteGReg(WK2XXX_GENA,gena);
//使能子串口總中斷
gier=WkReadGReg(WK2XXX_GIER);
gier=gier&(~(1<<(port-1)));
WkWriteGReg(WK2XXX_GIER,gier);
//軟件復(fù)位子串口
grst=WkReadGReg(WK2XXX_GRST);
grst=grst|(1<<(port-1));
WkWriteGReg(WK2XXX_GRST,grst);
}
/**************************Wk_SetBaud*******************************************************/
//函數(shù)功能:設(shè)置子串口波特率函數(shù)、此函數(shù)中波特率的匹配值是根據(jù)11.0592Mhz下的外部晶振計算的
// port:子串口號
// baud:波特率大小.波特率表示方式,
/**************************Wk2114SetBaud*******************************************************/
uint8_t Wk_SetBaud(u8 port,uint32_t baudrate)
{
uint32_t temp,freq;
uint8_t scr;
uint8_t baud1,baud0,pres;
freq=11059200;/*芯片外部時鐘頻率*/
// freq=32000000;/*芯片外部時鐘頻率*/
if(freq>=(baudrate*16))
{
temp=(freq)/(baudrate*16);
temp=temp-1;
baud1=(uint8_t)((temp>>8)&0xff);
baud0=(uint8_t)(temp&0xff);
temp=(((freq%(baudrate*16))*100)/(baudrate));
pres=(temp+100/2)/100;
printf("Wk_SetBaud---freq:%d,baudrate:%d\n",freq,baudrate);
printf("Wk_SetBaud---baud1:%x,baud0:%x,pres:%x\n",baud1,baud0,pres);
//關(guān)掉子串口收發(fā)使能
scr=WkReadSReg(port,WK2XXX_SCR);
WkWriteSReg(port,WK2XXX_SCR,0);
//設(shè)置波特率相關(guān)寄存器
WkWriteSReg(port,WK2XXX_SPAGE,1);//切換到page1
WkWriteSReg(port,WK2XXX_BAUD1,baud1);
WkWriteSReg(port,WK2XXX_BAUD0,baud0);
WkWriteSReg(port,WK2XXX_PRES,pres);
WkWriteSReg(port,WK2XXX_SPAGE,0);//切換到page0
//使能子串口收發(fā)使能
WkWriteSReg(port,WK2XXX_SCR,scr);
return 0;
}
else
{
printf("Wk_SetBaud error!。!\n");
return 1;
}
}
/**************************WK_TxLen*******************************************/
//函數(shù)功能:獲取子串口發(fā)送FIFO剩余空間長度
// port:端口號
// 返回值:發(fā)送FIFO剩余空間長度
/**************************WK_Len********************************************/
int wk_TxLen(u8 port)
{
u8 fsr,tfcnt;
int len=0;
fsr =WkReadSReg(port,WK2XXX_FSR);
tfcnt=WkReadSReg(port,WK2XXX_TFCNT);
if(fsr& WK2XXX_TFULL)
{ len=0;}
else
{len=256-tfcnt;}
return len;
}
/**************************WK_TxChars*******************************************/
//函數(shù)功能:通過子串口發(fā)送固定長度數(shù)據(jù)
// port:端口號
// len:單次發(fā)送長度不超過256
//
/**************************WK_TxChars********************************************/
int wk_TxChars(u8 port,int len,u8 *sendbuf)
{
#if 1
WkWriteSFifo(port,sendbuf,len);//通過fifo方式發(fā)送數(shù)據(jù)
#else
int num=len;
for(num=0;num<len;num++)
{
WkWriteSReg(port,WK2XXX_FDAT,*(sendbuf+num));
}
#endif
}
/**************************WK_RxChars*******************************************/
//函數(shù)功能:讀取子串口fifo中的數(shù)據(jù)
// port:端口號
// recbuf:接收到的數(shù)據(jù)
// 返回值:接收數(shù)據(jù)的長度
/**************************WK_RxChars********************************************/
int wk_RxChars(u8 port,u8 *recbuf)
{
u8 fsr=0,rfcnt=0,rfcnt2=0,sifr=0;
int n,len=0;
sifr=WkReadSReg(port,WK2XXX_SIFR);
if((sifr&WK2XXX_RFTRIG_INT)||(sifr&WK2XXX_RXOVT_INT))//有接收中斷和接收超時中斷
{
fsr =WkReadSReg(port,WK2XXX_FSR);
rfcnt=WkReadSReg(port,WK2XXX_RFCNT);
rfcnt2=WkReadSReg(port,WK2XXX_RFCNT);
//printf("rfcnt=0x%x.\n",rfcnt);
/*判斷fifo中數(shù)據(jù)個數(shù)*/
if(fsr& WK2XXX_RDAT)
{
if(!(rfcnt2>=rfcnt))
{
rfcnt=rfcnt2;
}
len=(rfcnt==0)?256:rfcnt;
}
#if 1
WkReadSFifo(port,recbuf,len);
#else
for(n=0;n<len;n++)
*(recbuf+n)=WkReadSReg(port,WK2XXX_FDAT);
#endif
return len;
}
else
{
len=0;
return len;
}
}
/**************************WK_RS485*******************************************************/
//函數(shù)功能:設(shè)置子串口RS485的收發(fā)轉(zhuǎn)換函數(shù),使用RTS引腳控制485電平轉(zhuǎn)換芯片的收發(fā)
// port:子串口號
//
//注意:只有WK2168/WK2204支持該功能
/**************************WK_RS485*******************************************************/
void WK_RS485(u8 port)
{
WkWriteSReg(port,WK2XXX_RS485,0x02);//默認(rèn)高電平
//WkWriteSReg(port,WK2XXX_RS485,0x03);//默認(rèn)低電平
WkWriteSReg(port,WK2XXX_SPAGE,1);//切換到page1
WkWriteSReg(port,WK2XXX_RTSDLY,0X10);
WkWriteSReg(port,WK2XXX_SPAGE,0);//切換到page0
}
/**************************WK_RTSCTS*******************************************************/
//函數(shù)功能:硬件自動流量控制,需要子設(shè)備的支持
// port:子串口號
//
//注意:只有WK2168/WK2204支持該功能
/**************************WK_RTSCTS*******************************************************/
void WK_RTSCTS(u8 port)
{
WkWriteSReg(port,WK2XXX_FWCR,0x30);//
WkWriteSReg(port,WK2XXX_SPAGE,1);//切換到page1
WkWriteSReg(port,WK2XXX_FWTH,0XF0);//停止接收觸點(diǎn)
WkWriteSReg(port,WK2XXX_FWTL,0X20);//繼續(xù)接收觸點(diǎn)
WkWriteSReg(port,WK2XXX_SPAGE,0);//切換到page0
}
/**************************WK_IrqApp*******************************************/
//函數(shù)功能:中斷處理的一般流程,可以根據(jù)需要修改
//
//
//
/**************************WK_IrqApp********************************************/
//u8 WK_IrqApp(void)
//{
// u8 gifr,sier,sifr;
// gifr=WkReadGReg(WK2XXX_GIFR);
// if(gifr&WK2XXX_UT1INT)//判斷子串口1是否有中斷
// {
// sifr =WkReadSReg(1,WK2XXX_SIFR);
// if()
// }
// if(gifr&WK2XXX_UT2INT)//判斷子串口2是否有中斷
// {
//
// }
// if(gifr&WK2XXX_UT3INT)//判斷子串口3是否有中斷
// {
//
// }
// if(gifr&WK2XXX_UT4INT)//判斷子串口4是否有中斷
// {
//
// }
//
//
//}
|
評分
-
查看全部評分
|