你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32驱动WK2168串口扩展芯片完整教程

[复制链接]
STMCU小助手 发布时间:2022-4-20 20:34
一、WK2168介绍
WK2168是首款具备256级FIFO的低功耗并支持 UART/SPITM/IIC/8位并行总线接口的
4通道UART器件。可以通过模式选择使得该芯片工作于以上任何一种主接口模式,将选
定的主接口扩展为4个增强功能的UART。
扩展的子通道的UART具备如下功能特点:
1.每个子通道UART的波特率、字长、校验格式可以独立设置,最高可以提供2Mbps
的通信速率。
2.每个子通道可以独立设置工作在IrDA红外通信、 RS-485自动收发控制、 9位网络
地址自动识别、软件/硬件自动流量控制等高级工作模式下。
3.每个子通道具备收/发独立的256 级FIFO, FIFO的中断可按用户需求进行编程触
发点且具备超时中断功能。
WK2168采用LQFP48绿色环保的无铅封装,可以工作在2.5~5.0V的宽工作电压范围,
具备可配置自动休眠/唤醒功能
二、硬件连接

20210413134012387.jpg

20210413134020902.jpg

三、驱动代码
main.c

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "wk2168.h"





  6. int main(void)
  7. {        
  8.         //wk2xxx相关定义
  9.         u8 sendTimeCnt;
  10.         u16 ledCnt;
  11.         u8 dat1;
  12.         u8 sendData[5]={0x01,0x02,0x03,0x04,0x05};
  13.         
  14.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  15.         delay_init();        
  16.         uart_init(115200);
  17.         led_init();        
  18.         wk2168_init();        
  19.         wk2168_exit_init();

  20. /*读写GNEA,测试主接口通信是否成功*/
  21.         dat1=wk2168_read_g_reg(WK2XXX_GENA);
  22.         printf("gena=0x%x.\r\n",dat1);


  23.         /*初始化子串口*/
  24.         wk2168_sub_uart_init(1);
  25.         wk2168_sub_uart_init(2);
  26.         wk2168_sub_uart_init(3);
  27.         wk2168_sub_uart_init(4);
  28.         /*设置子串口波特率*/
  29.         wk2168_set_baudrate(1,B9600);
  30.         wk2168_set_baudrate(2,B9600);
  31.         wk2168_set_baudrate(3,B9600);
  32.         wk2168_set_baudrate(4,B9600);
  33.         /*使能485*/
  34.         wk2168_set_rs485(1);
  35.         wk2168_set_rs485(2);
  36.         wk2168_set_rs485(3);
  37.         wk2168_set_rs485(4);

  38.         
  39.         while(1)
  40.         {
  41.                
  42.                 sendTimeCnt++;
  43.                 if(sendTimeCnt>=100)
  44.                 {
  45.                         sendTimeCnt=0;
  46.                         wk2168_exti_disable();               
  47.                         wk2168_write_s_fifo(1,sendData,sizeof(sendData));
  48.                         wk2168_write_s_fifo(2,sendData,sizeof(sendData));
  49.                         wk2168_write_s_fifo(3,sendData,sizeof(sendData));
  50.                         wk2168_write_s_fifo(4,sendData,sizeof(sendData));
  51.                         wk2168_exti_enable();                                
  52.                         
  53.                 }
  54.         
  55.                
  56.                 ledCnt++;
  57.                 if(ledCnt>=50)
  58.                 {
  59.                         ledCnt=0;
  60.                         turn_prog_led();
  61.                 }
  62.                
  63.                 delay_ms(10);
  64.         }
  65. }
复制代码

wk2168.c

  1. #include "wk2168.h"
  2. #include "delay.h"


  3. void wk2168_init(void)
  4. {
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.         SPI_InitTypeDef SPI_InitStructure;
  7.         
  8.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE );        
  9.         
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//PA0--INT#
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
  13.         GPIO_Init( GPIOB, &GPIO_InitStructure );
  14.         
  15.         
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//SPI1_RST
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
  19.         GPIO_Init( GPIOB, &GPIO_InitStructure );
  20.         GPIO_SetBits(GPIOB,GPIO_Pin_0);
  21.         
  22.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//SPI1_CS
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
  25.         GPIO_Init( GPIOA, &GPIO_InitStructure );
  26.         GPIO_SetBits(GPIOA,GPIO_Pin_4);
  27.         
  28.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//SPI1_SCK
  29.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        
  30.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  31.         GPIO_Init( GPIOA, &GPIO_InitStructure );        

  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//SPI1_MISO
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;               
  34.         GPIO_Init( GPIOA, &GPIO_InitStructure );        
  35.         
  36.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//SPI1_MOSI
  37.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;               
  38.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  39.         GPIO_Init( GPIOA, &GPIO_InitStructure );
  40.         
  41.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;        
  42.         
  43.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;        

  44.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        
  45.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;        
  46.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        
  47.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        
  48.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  49.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        
  50.         SPI_InitStructure.SPI_CRCPolynomial = 7;
  51.         SPI_Init( SPI1, &SPI_InitStructure );

  52.         SPI_Cmd( SPI1, ENABLE );
  53.         

  54.         wk2168_rst=0;
  55.         delay_ms(50);
  56.         wk2168_rst=1;
  57.         delay_ms(10);
  58.         
  59. }

  60. void wk2168_exit_init()
  61. {
  62.          EXTI_InitTypeDef EXTI_InitStructure;
  63.          NVIC_InitTypeDef NVIC_InitStructure;

  64.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟


  65.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//下降沿触发

  66.           EXTI_InitStructure.EXTI_Line=EXTI_Line1;        
  67.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  68.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  69.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  70.           EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

  71.     NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键KEY2所在的外部中断通道
  72.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;        //抢占优先级2,
  73.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级2
  74.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  75.           NVIC_Init(&NVIC_InitStructure);        
  76. }
  77. void wk2168_exti_enable(void)
  78. {
  79.         NVIC_InitTypeDef NVIC_InitStructure;
  80.         
  81.         NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键KEY2所在的外部中断通道
  82.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;        //抢占优先级2,
  83.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级2
  84.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  85.           NVIC_Init(&NVIC_InitStructure);
  86. }

  87. void wk2168_exti_disable(void)
  88. {
  89.         NVIC_InitTypeDef NVIC_InitStructure;
  90.         
  91.         NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键KEY2所在的外部中断通道
  92.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;        //抢占优先级2,
  93.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级2
  94.           NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;                                                                //使能外部中断通道
  95.           NVIC_Init(&NVIC_InitStructure);
  96. }
  97. //外部中断0服务程序
  98. void EXTI1_IRQHandler(void)
  99. {
  100.         u8 gifr,rxbuf[256];
  101.         int rxlen;        
  102.         if(EXTI_GetFlagStatus(EXTI_Line1)!= RESET)
  103.         {
  104.                 gifr=wk2168_read_g_reg(WK2XXX_GIFR);/**/
  105.                 do{
  106.                         if(gifr&WK2XXX_UT1INT)//判断子串口1是否有中断
  107.                         {
  108.                                 /*数据处理*/
  109.                                 /*数据接收*/
  110.                                 rxlen=wk2168_rec_data(1,rxbuf);//一次接收的数据不会超过256Byte
  111.                                 /*数据发送*/
  112.                                 //把接收的数据发送出去
  113.                                 wk2168_send_data(1,rxlen,rxbuf);

  114.                         }
  115.                         
  116.                         if(gifr&WK2XXX_UT2INT)//判断子串口2是否有中断
  117.                         {
  118.                                 /*数据接收*/
  119.                                 rxlen=wk2168_rec_data(2,rxbuf);//一次接收的数据不会超过256Byte
  120.                                 /*数据发送*/
  121.                                 //把接收的数据发送出去
  122.                                 wk2168_send_data(2,rxlen,rxbuf);
  123.                         
  124.                           }
  125.                         if(gifr&WK2XXX_UT3INT)//判断子串口3是否有中断
  126.                         {
  127.                                 /*数据接收*/
  128.                                 rxlen=wk2168_rec_data(3,rxbuf);//一次接收的数据不会超过256Byte
  129.                                 /*数据发送*/
  130.                                 //把接收的数据发送出去
  131.                                 wk2168_send_data(3,rxlen,rxbuf);
  132.                                 // printf("port!!!!\n");
  133.                         }
  134.                         if(gifr&WK2XXX_UT4INT)//判断子串口4是否有中断
  135.                         {
  136.                                 /*数据接收*/
  137.                                 rxlen=wk2168_rec_data(4,rxbuf);//一次接收的数据不会超过256Byte
  138.                                 /*数据发送*/
  139.                                 //把接收的数据发送出去
  140.                                 wk2168_send_data(4,rxlen,rxbuf);
  141.                         }
  142.                         
  143.                         gifr=wk2168_read_g_reg(WK2XXX_GIFR);
  144.                         //printf("IN EXTI2_IRQ GIFR:0X%X !!!\n",gifr);
  145.                 }while(gifr&0x0f);                                       
  146.                 EXTI_ClearITPendingBit(EXTI_Line1); //清除LINE0上的中断标志位  
  147.         }
  148. }
  149. /* SPI交换一个字节接口 */
  150. u8 wk2168_spi_read_write_byte(u8 TxData)
  151. {
  152.         u8 retry=0;                                         
  153.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
  154.         {
  155.                 retry++;
  156.                 if(retry>200)return 0;
  157.         }                          
  158.         SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
  159.         retry=0;

  160.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
  161.         {
  162.                 retry++;
  163.                 if(retry>200)return 0;
  164.         }                                                              
  165.         return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据        
  166. }

  167. /*************************************************************************/
  168. //函数功能:设置CS信号为高电平
  169. /*************************************************************************/
  170. void wk2168_cs_high(void)
  171. {
  172.         GPIO_SetBits(GPIOA,GPIO_Pin_4);
  173. }
  174. /*************************************************************************/
  175. //函数功能:设置CS信号为低电平
  176. /*************************************************************************/
  177. void wk2168_cs_low(void)
  178. {
  179.         GPIO_ResetBits(GPIOA,GPIO_Pin_4);
  180. }
  181. /***************************wk2168_write_g_reg***********************************/
  182. //函数功能:写全局寄存器函数(前提是该寄存器可写,
  183. //某些寄存器如果你写1,可能会自动置1,具体见数据手册)
  184. //参数:
  185. //      greg:为全局寄存器的地址
  186. //      dat:为写入寄存器的数据
  187. //***********************************************************************/
  188. void wk2168_write_g_reg(unsigned char greg,unsigned char dat)
  189. {         
  190.         u8 cmd;
  191.         cmd=0|greg;
  192.         wk2168_cs_low();//拉低cs信号
  193.         wk2168_spi_read_write_byte(cmd);        //写指令,对于指令的构成见数据手册
  194.         wk2168_spi_read_write_byte(dat);//写数据
  195.         wk2168_cs_high();//拉高cs信号
  196. }
  197. /****************************wk2168_read_g_reg***********************************/
  198. //函数功能:读全局寄存器
  199. //参数:
  200. //      greg:为全局寄存器的地址
  201. //      rec:返回的寄存器值
  202. //***********************************************************************/
  203. u8 wk2168_read_g_reg(unsigned char greg)
  204. {         
  205.         u8 cmd,rec;
  206.         cmd=0x40|greg;
  207.         wk2168_cs_low();//拉低cs信号
  208.         wk2168_spi_read_write_byte(cmd);        //写指令,对于指令的构成见数据手册
  209.         rec=wk2168_spi_read_write_byte(0);//写数据
  210.         wk2168_cs_high();//拉高cs信号                                                        
  211.         return rec;
  212. }

  213. /**************************wk2168_write_s_reg***********************************/
  214. //函数功能:
  215. //参数:port:为子串口
  216. //      sreg:为子串口寄存器
  217. //      dat:为写入寄存器的数据
  218. //注意:在子串口被打通的情况下,向FDAT写入的数据会通过TX引脚输出
  219. //**********************************************************************/
  220. void wk2168_write_s_reg(u8 port,u8 sreg,u8 dat)
  221. {         
  222.         u8 cmd;
  223.         cmd=0x0|((port-1)<<4)|sreg;
  224.         wk2168_cs_low();//拉低cs信号
  225.         wk2168_spi_read_write_byte(cmd);        //写指令,对于指令的构成见数据手册
  226.         wk2168_spi_read_write_byte(dat);//写数据
  227.         wk2168_cs_high();//拉高cs信号
  228. }

  229. /**************************wk2168_read_s_reg***********************************/
  230. //函数功能:读子串口寄存器
  231. //参数:port为子串口端口号
  232. //      sreg:为子串口寄存器地址
  233. //      rec:返回的寄存器值
  234. //**********************************************************************/
  235. u8 wk2168_read_s_reg(u8 port,u8 sreg)
  236. {         
  237.         u8 cmd,rec;
  238.         cmd=0x40|((port-1)<<4)|sreg;
  239.         wk2168_cs_low();//拉低cs信号
  240.         wk2168_spi_read_write_byte(cmd);        //写指令,对于指令的构成见数据手册
  241.         rec=wk2168_spi_read_write_byte(0);//写数据
  242.         wk2168_cs_high();        //拉高cs信号                                                        
  243.         return rec;
  244. }
  245. /************************wk2168_write_s_fifo***********************************/
  246. //函数功能:向子串口fifo写入需要发送的数据
  247. //参数:port:为子串口
  248. //      *dat:写入数据
  249. //      num:为写入数据的个数,单次不超过256
  250. //注意:通过该方式写入的数据,被直接写入子串口的缓存FIFO,然后被发送
  251. //*********************************************************************/
  252. void wk2168_write_s_fifo(u8 port,u8 *dat,int num)
  253. {         
  254.         u8 cmd;
  255.         int i;
  256.         cmd=0x80|((port-1)<<4);
  257.         if(num>0)
  258.         {
  259.                 wk2168_cs_low();//拉低cs信号
  260.                 wk2168_spi_read_write_byte(cmd); //写指令,对于指令构成见数据手册
  261.                 for(i=0;i<num;i++)
  262.                 {
  263.                         wk2168_spi_read_write_byte( *(dat+i));//写数据
  264.                 }
  265.                 wk2168_cs_high();//拉高cs信号
  266.         }
  267. }

  268. /************************wk2168_read_s_fifo***********************************/
  269. //函数功能:从子串口的fifo中读出接收到的数据
  270. //参数:port:为子串口
  271. //      *rec:接收到的数据
  272. //      num:读出的数据个数。
  273. //注意:通过该方式读出子串口缓存中的数据。单次不能超过256
  274. //*********************************************************************/
  275. void wk2168_read_s_fifo(u8 port,u8 *rec,int num)
  276. {
  277.         u8 cmd;
  278.         int n;
  279.         cmd=0xc0|((port-1)<<4);
  280.         if(num>0)
  281.         {
  282.                 wk2168_cs_low();//拉低cs信号
  283.                 wk2168_spi_read_write_byte(cmd);
  284.                 for(n=0;n<num;n++)
  285.                 {        
  286.                         *(rec+n)=wk2168_spi_read_write_byte(0);        
  287.                 }
  288.                 wk2168_cs_high();//拉高cs信号
  289.         }
  290. }


  291. /*******WkInit*******************************************/
  292. //函数功能:初始化子串口
  293. /*******************************************************/
  294. void wk2168_sub_uart_init(u8 port)
  295. {
  296.         u8 gena,grst,gier,sier,scr;
  297.         //使能子串口时钟
  298.         gena=wk2168_read_g_reg(WK2XXX_GENA);
  299.         gena=gena|(1<<(port-1));
  300.         wk2168_write_g_reg(WK2XXX_GENA,gena);
  301.         //软件复位子串口
  302.         grst=wk2168_read_g_reg(WK2XXX_GRST);
  303.         grst=grst|(1<<(port-1));
  304.         wk2168_write_g_reg(WK2XXX_GRST,grst);
  305.         //使能串口总中断
  306.         gier=wk2168_read_g_reg(WK2XXX_GIER);
  307.         gier=gier|(1<<(port-1));
  308.         wk2168_write_g_reg(WK2XXX_GIER,gier);
  309.         //使能子串口接收触点中断和超时中断
  310.         sier=wk2168_read_s_reg(port,WK2XXX_SIER);
  311.         sier |= WK2XXX_RFTRIG_IEN|WK2XXX_RXOUT_IEN;
  312.         wk2168_write_s_reg(port,WK2XXX_SIER,sier);
  313.         //初始化FIFO和设置固定中断触点
  314.         wk2168_write_s_reg(port,WK2XXX_FCR,0XFF);  
  315.         //设置任意中断触点,如果下面的设置有效,
  316.         //那么上面FCR寄存器中断的固定中断触点将失效
  317.         wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
  318.         wk2168_write_s_reg(port,WK2XXX_RFTL,0X40);//设置接收触点为64个字节
  319.         wk2168_write_s_reg(port,WK2XXX_TFTL,0X10);//设置发送触点为16个字节
  320.         wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
  321.         //使能子串口的发送和接收使能
  322.         scr=wk2168_read_s_reg(port,WK2XXX_SCR);
  323.         scr|=WK2XXX_TXEN|WK2XXX_RXEN;
  324.         wk2168_write_s_reg(port,WK2XXX_SCR,scr);                          
  325. }

  326. /******************************wk2168_sub_uart_deinit*******************************************/
  327. //函数功能:初始化子串口
  328. /*********************************************************************************/
  329. void wk2168_sub_uart_deinit(u8 port)
  330. {
  331.         u8 gena,grst,gier;
  332.         //关闭子串口总时钟
  333.         gena=wk2168_read_g_reg(WK2XXX_GENA);
  334.         gena=gena&(~(1<<(port-1)));
  335.         wk2168_write_g_reg(WK2XXX_GENA,gena);
  336.         //使能子串口总中断
  337.         gier=wk2168_read_g_reg(WK2XXX_GIER);
  338.         gier=gier&(~(1<<(port-1)));
  339.         wk2168_write_g_reg(WK2XXX_GIER,gier);
  340.         //软件复位子串口
  341.         grst=wk2168_read_g_reg(WK2XXX_GRST);
  342.         grst=grst|(1<<(port-1));
  343.         wk2168_write_g_reg(WK2XXX_GRST,grst);
  344.         
  345. }

  346. /**************************wk2168_set_baudrate*******************************************************/
  347. //函数功能:设置子串口波特率函数、此函数中波特率的匹配值是根据11.0592Mhz下的外部晶振计算的
  348. // port:子串口号
  349. // baud:波特率大小.波特率表示方式,
  350. /**************************Wk2114SetBaud*******************************************************/
  351. void wk2168_set_baudrate(u8 port,enum WKBaud baud)
  352. {  
  353.         unsigned char baud1,baud0,pres,scr;
  354.         //如下波特率相应的寄存器值,是在外部时钟为11.0592mhz的情况下计算所得,如果使用其他晶振,需要重新计算
  355.         switch (baud)
  356.         {
  357.                 case B600:
  358.                         baud1=0x4;
  359.                         baud0=0x7f;
  360.                         pres=0;
  361.                         break;
  362.                 case B1200:
  363.                         baud1=0x2;
  364.                         baud0=0x3F;
  365.                         pres=0;
  366.                         break;
  367.                 case B2400:
  368.                         baud1=0x1;
  369.                         baud0=0x1f;
  370.                         pres=0;
  371.                         break;
  372.                 case B4800:
  373.                         baud1=0x00;
  374.                         baud0=0x8f;
  375.                         pres=0;
  376.                         break;
  377.                 case B9600:
  378.                         baud1=0x00;
  379.                         baud0=0x47;
  380.                         pres=0;
  381.                         break;
  382.                 case B19200:
  383.                         baud1=0x00;
  384.                         baud0=0x23;
  385.                         pres=0;
  386.                         break;
  387.                 case B38400:
  388.                         baud1=0x00;
  389.                         baud0=0x11;
  390.                         pres=0;
  391.                         break;
  392.                 case B76800:
  393.                         baud1=0x00;
  394.                         baud0=0x08;
  395.                         pres=0;
  396.                         break;        
  397.                 case B1800:
  398.                         baud1=0x01;
  399.                         baud0=0x7f;
  400.                         pres=0;
  401.                         break;
  402.                 case B3600:
  403.                         baud1=0x00;
  404.                         baud0=0xbf;
  405.                         pres=0;
  406.                         break;
  407.                 case B7200:
  408.                         baud1=0x00;
  409.                         baud0=0x5f;
  410.                         pres=0;
  411.                         break;
  412.                 case B14400:
  413.                         baud1=0x00;
  414.                         baud0=0x2f;
  415.                         pres=0;
  416.                         break;
  417.                 case B28800:
  418.                         baud1=0x00;
  419.                         baud0=0x17;
  420.                         pres=0;
  421.                         break;
  422.                 case B57600:
  423.                         baud1=0x00;
  424.                         baud0=0x0b;
  425.                         pres=0;
  426.                         break;
  427.                 case B115200:
  428.                         baud1=0x00;
  429.                         baud0=0x05;
  430.                         pres=0;
  431.                         break;
  432.                 case B230400:
  433.                         baud1=0x00;
  434.                         baud0=0x02;
  435.                         pres=0;
  436.                         break;
  437.                 default:
  438.                         baud1=0x00;
  439.                         baud0=0x00;
  440.                         pres=0;
  441.     }
  442.         //关掉子串口收发使能
  443.         scr=wk2168_read_s_reg(port,WK2XXX_SCR);
  444.         wk2168_write_s_reg(port,WK2XXX_SCR,0);
  445.         //设置波特率相关寄存器
  446.         wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
  447.         wk2168_write_s_reg(port,WK2XXX_BAUD1,baud1);
  448.         wk2168_write_s_reg(port,WK2XXX_BAUD0,baud0);
  449.         wk2168_write_s_reg(port,WK2XXX_PRES,pres);
  450.         wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
  451.         //使能子串口收发使能
  452.         wk2168_write_s_reg(port,WK2XXX_SCR,scr);
  453. }
  454. /**************************wk2168_get_tx_len*******************************************/
  455. //函数功能:获取子串口发送FIFO剩余空间长度
  456. // port:端口号
  457. // 返回值:发送FIFO剩余空间长度
  458. /**************************WK_Len********************************************/
  459. int wk2168_get_tx_len(u8 port)
  460. {
  461.         u8 fsr,tfcnt;
  462.         int len=0;
  463.         fsr  =wk2168_read_s_reg(port,WK2XXX_FSR);
  464.         tfcnt=wk2168_read_s_reg(port,WK2XXX_TFCNT);
  465.         if(fsr& WK2XXX_TFULL)
  466.         {
  467.                 len=0;
  468.         }
  469.         else
  470.         {
  471.                 len=256-tfcnt;
  472.         }
  473.         return len;
  474. }

  475. /**************************wk2168_send_data*******************************************/
  476. //函数功能:通过子串口发送固定长度数据
  477. // port:端口号
  478. // len:单次发送长度不超过256
  479. //
  480. /**************************wk2168_send_data********************************************/
  481. int wk2168_send_data(u8 port,int len,u8 *sendbuf)
  482. {
  483.         
  484. #if 1
  485.         wk2168_write_s_fifo(port,sendbuf,len);//通过fifo方式发送数据
  486. #else
  487.         int num=len;
  488.         for(num=0;num<len;num++)
  489.         {
  490.                 wk2168_write_s_reg(port,WK2XXX_FDAT,*(sendbuf+num));
  491.         }
  492. #endif        
  493.         return 0;
  494. }

  495. /**************************wk2168_rec_data*******************************************/
  496. //函数功能:读取子串口fifo中的数据
  497. // port:端口号
  498. // recbuf:接收到的数据
  499. // 返回值:接收数据的长度
  500. /**************************wk2168_rec_data********************************************/
  501. int wk2168_rec_data(u8 port,u8 *recbuf)
  502. {
  503.         u8  fsr=0,rfcnt=0,rfcnt2=0,sifr=0;
  504.         int len=0;
  505.         sifr=wk2168_read_s_reg(port,WK2XXX_SIFR);
  506.         

  507.         if((sifr&WK2XXX_RFTRIG_INT)||(sifr&WK2XXX_RXOVT_INT))//有接收中断和接收超时中断
  508.         {
  509.                 fsr  =wk2168_read_s_reg(port,WK2XXX_FSR);
  510.                 rfcnt=wk2168_read_s_reg(port,WK2XXX_RFCNT);
  511.                 rfcnt2=wk2168_read_s_reg(port,WK2XXX_RFCNT);
  512.                 //printf("rfcnt=0x%x.\n",rfcnt);
  513.                 /*判断fifo中数据个数*/
  514.                 if(fsr& WK2XXX_RDAT)
  515.                 {
  516.                         if(!(rfcnt2>=rfcnt))
  517.                         {
  518.                                 rfcnt=rfcnt2;
  519.                         }
  520.                         len=(rfcnt==0)?256:rfcnt;
  521.                 }
  522. #if 1
  523.                 wk2168_read_s_fifo(port,recbuf,len);
  524. #else
  525.                 for(n=0;n<len;n++)
  526.                  *(recbuf+n)=wk2168_read_s_reg(port,WK2XXX_FDAT);
  527. #endif        
  528.                 return len;
  529.         }
  530.         else
  531.         {
  532.                 len=0;
  533.                 return len;
  534.         }
  535. }

  536. /**************************wk2168_set_rs485*******************************************************/
  537. //函数功能:设置子串口RS485的收发转换函数,使用RTS引脚控制485电平转换芯片的收发
  538. // port:子串口号
  539. //
  540. //注意:只有WK2168/WK2204支持该功能
  541. /**************************wk2168_set_rs485*******************************************************/
  542. void wk2168_set_rs485(u8 port)
  543. {   
  544.         wk2168_write_s_reg(port,WK2XXX_RS485,0x02);//
  545.         //wk2168_write_s_reg(port,WK2XXX_RS485,0x03);//
  546.         wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
  547.         wk2168_write_s_reg(port,WK2XXX_RTSDLY,0x01);
  548.         wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
  549. }
  550. /**************************wk2168_rts_cts*******************************************************/
  551. //函数功能:硬件自动流量控制,需要子设备的支持
  552. // port:子串口号
  553. //
  554. //注意:只有WK2168/WK2204支持该功能
  555. /**************************wk2168_rts_cts*******************************************************/
  556. void wk2168_rts_cts(u8 port)
  557. {   
  558.         wk2168_write_s_reg(port,WK2XXX_FWCR,0x30);//
  559.         wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1
  560.         wk2168_write_s_reg(port,WK2XXX_FWTH,0XF0);//停止接收触点
  561.         wk2168_write_s_reg(port,WK2XXX_FWTL,0X20);//继续接收触点
  562.         wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
  563. }



复制代码


收藏 评论0 发布时间:2022-4-20 20:34

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版