一、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的宽工作电压范围,
具备可配置自动休眠/唤醒功能
二、硬件连接


三、驱动代码
main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "wk2168.h"int main(void)
{   //wk2xxx相关定义u8 sendTimeCnt;u16 ledCnt;u8 dat1;u8 sendData[5]={0x01,0x02,0x03,0x04,0x05};NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级delay_init();  uart_init(115200);led_init();   wk2168_init();  wk2168_exit_init();/*读写GNEA,测试主接口通信是否成功*/dat1=wk2168_read_g_reg(WK2XXX_GENA);printf("gena=0x%x.\r\n",dat1);/*初始化子串口*/wk2168_sub_uart_init(1);wk2168_sub_uart_init(2);wk2168_sub_uart_init(3);wk2168_sub_uart_init(4);/*设置子串口波特率*/wk2168_set_baudrate(1,B9600);wk2168_set_baudrate(2,B9600);wk2168_set_baudrate(3,B9600);wk2168_set_baudrate(4,B9600);/*使能485*/wk2168_set_rs485(1);wk2168_set_rs485(2);wk2168_set_rs485(3);wk2168_set_rs485(4);while(1){sendTimeCnt++;if(sendTimeCnt>=100){sendTimeCnt=0;wk2168_exti_disable();        wk2168_write_s_fifo(1,sendData,sizeof(sendData));wk2168_write_s_fifo(2,sendData,sizeof(sendData));wk2168_write_s_fifo(3,sendData,sizeof(sendData));wk2168_write_s_fifo(4,sendData,sizeof(sendData));wk2168_exti_enable();               }ledCnt++;if(ledCnt>=50){ledCnt=0;turn_prog_led();}delay_ms(10);}
}

wk2168.c

#include "wk2168.h"
#include "delay.h"void wk2168_init(void)
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE );   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//PA0--INT#GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_Init( GPIOB, &GPIO_InitStructure );GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//SPI1_RSTGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_Init( GPIOB, &GPIO_InitStructure );GPIO_SetBits(GPIOB,GPIO_Pin_0);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//SPI1_CSGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_Init( GPIOA, &GPIO_InitStructure );GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//SPI1_SCKGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init( GPIOA, &GPIO_InitStructure );  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//SPI1_MISOGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;     GPIO_Init( GPIOA, &GPIO_InitStructure );    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//SPI1_MOSIGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init( GPIOA, &GPIO_InitStructure );SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init( SPI1, &SPI_InitStructure );SPI_Cmd( SPI1, ENABLE );wk2168_rst=0;delay_ms(50);wk2168_rst=1;delay_ms(10);}void wk2168_exit_init()
{EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);    //使能复用功能时钟GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//下降沿触发EXTI_InitStructure.EXTI_Line=EXTI_Line1;    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);       //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;          //使能按键KEY2所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;    //抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                 //子优先级2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道NVIC_Init(&NVIC_InitStructure);
}
void wk2168_exti_enable(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;          //使能按键KEY2所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;    //抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                 //子优先级2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道NVIC_Init(&NVIC_InitStructure);
}void wk2168_exti_disable(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;          //使能按键KEY2所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;    //抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                 //子优先级2NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;                                //使能外部中断通道NVIC_Init(&NVIC_InitStructure);
}
//外部中断0服务程序
void EXTI1_IRQHandler(void)
{u8 gifr,rxbuf[256];int rxlen;  if(EXTI_GetFlagStatus(EXTI_Line1)!= RESET){gifr=wk2168_read_g_reg(WK2XXX_GIFR);/**/do{if(gifr&WK2XXX_UT1INT)//判断子串口1是否有中断{ /*数据处理*//*数据接收*/rxlen=wk2168_rec_data(1,rxbuf);//一次接收的数据不会超过256Byte/*数据发送*///把接收的数据发送出去wk2168_send_data(1,rxlen,rxbuf);}if(gifr&WK2XXX_UT2INT)//判断子串口2是否有中断{/*数据接收*/rxlen=wk2168_rec_data(2,rxbuf);//一次接收的数据不会超过256Byte/*数据发送*///把接收的数据发送出去wk2168_send_data(2,rxlen,rxbuf);}if(gifr&WK2XXX_UT3INT)//判断子串口3是否有中断{/*数据接收*/rxlen=wk2168_rec_data(3,rxbuf);//一次接收的数据不会超过256Byte/*数据发送*///把接收的数据发送出去wk2168_send_data(3,rxlen,rxbuf);// printf("port!!!!\n");}if(gifr&WK2XXX_UT4INT)//判断子串口4是否有中断{/*数据接收*/rxlen=wk2168_rec_data(4,rxbuf);//一次接收的数据不会超过256Byte/*数据发送*///把接收的数据发送出去wk2168_send_data(4,rxlen,rxbuf);}gifr=wk2168_read_g_reg(WK2XXX_GIFR);//printf("IN EXTI2_IRQ GIFR:0X%X !!!\n",gifr);}while(gifr&0x0f);                  EXTI_ClearITPendingBit(EXTI_Line1); //清除LINE0上的中断标志位  }
}
/* SPI交换一个字节接口 */
u8 wk2168_spi_read_write_byte(u8 TxData)
{u8 retry=0;                   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位{retry++;if(retry>200)return 0;}              SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据retry=0;while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位{retry++;if(retry>200)return 0;}                               return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
}/*************************************************************************/
//函数功能:设置CS信号为高电平
/*************************************************************************/
void wk2168_cs_high(void)
{GPIO_SetBits(GPIOA,GPIO_Pin_4);
}
/*************************************************************************/
//函数功能:设置CS信号为低电平
/*************************************************************************/
void wk2168_cs_low(void)
{GPIO_ResetBits(GPIOA,GPIO_Pin_4);
}
/***************************wk2168_write_g_reg***********************************/
//函数功能:写全局寄存器函数(前提是该寄存器可写,
//某些寄存器如果你写1,可能会自动置1,具体见数据手册)
//参数:
//      greg:为全局寄存器的地址
//      dat:为写入寄存器的数据
//***********************************************************************/
void wk2168_write_g_reg(unsigned char greg,unsigned char dat)
{    u8 cmd;cmd=0|greg;wk2168_cs_low();//拉低cs信号wk2168_spi_read_write_byte(cmd);    //写指令,对于指令的构成见数据手册wk2168_spi_read_write_byte(dat);//写数据wk2168_cs_high();//拉高cs信号
}
/****************************wk2168_read_g_reg***********************************/
//函数功能:读全局寄存器
//参数:
//      greg:为全局寄存器的地址
//      rec:返回的寄存器值
//***********************************************************************/
u8 wk2168_read_g_reg(unsigned char greg)
{    u8 cmd,rec;cmd=0x40|greg;wk2168_cs_low();//拉低cs信号wk2168_spi_read_write_byte(cmd); //写指令,对于指令的构成见数据手册rec=wk2168_spi_read_write_byte(0);//写数据wk2168_cs_high();//拉高cs信号                          return rec;
}/**************************wk2168_write_s_reg***********************************/
//函数功能:
//参数:port:为子串口
//      sreg:为子串口寄存器
//      dat:为写入寄存器的数据
//注意:在子串口被打通的情况下,向FDAT写入的数据会通过TX引脚输出
//**********************************************************************/
void wk2168_write_s_reg(u8 port,u8 sreg,u8 dat)
{    u8 cmd;cmd=0x0|((port-1)<<4)|sreg;wk2168_cs_low();//拉低cs信号wk2168_spi_read_write_byte(cmd);  //写指令,对于指令的构成见数据手册wk2168_spi_read_write_byte(dat);//写数据wk2168_cs_high();//拉高cs信号
}/**************************wk2168_read_s_reg***********************************/
//函数功能:读子串口寄存器
//参数:port为子串口端口号
//      sreg:为子串口寄存器地址
//      rec:返回的寄存器值
//**********************************************************************/
u8 wk2168_read_s_reg(u8 port,u8 sreg)
{    u8 cmd,rec;cmd=0x40|((port-1)<<4)|sreg;wk2168_cs_low();//拉低cs信号wk2168_spi_read_write_byte(cmd); //写指令,对于指令的构成见数据手册rec=wk2168_spi_read_write_byte(0);//写数据wk2168_cs_high();  //拉高cs信号                            return rec;
}
/************************wk2168_write_s_fifo***********************************/
//函数功能:向子串口fifo写入需要发送的数据
//参数:port:为子串口
//      *dat:写入数据
//      num:为写入数据的个数,单次不超过256
//注意:通过该方式写入的数据,被直接写入子串口的缓存FIFO,然后被发送
//*********************************************************************/
void wk2168_write_s_fifo(u8 port,u8 *dat,int num)
{    u8 cmd;int i;cmd=0x80|((port-1)<<4);if(num>0){wk2168_cs_low();//拉低cs信号wk2168_spi_read_write_byte(cmd); //写指令,对于指令构成见数据手册for(i=0;i<num;i++){wk2168_spi_read_write_byte( *(dat+i));//写数据}wk2168_cs_high();//拉高cs信号}
}/************************wk2168_read_s_fifo***********************************/
//函数功能:从子串口的fifo中读出接收到的数据
//参数:port:为子串口
//      *rec:接收到的数据
//      num:读出的数据个数。
//注意:通过该方式读出子串口缓存中的数据。单次不能超过256
//*********************************************************************/
void wk2168_read_s_fifo(u8 port,u8 *rec,int num)
{u8 cmd;int n;cmd=0xc0|((port-1)<<4);if(num>0){wk2168_cs_low();//拉低cs信号wk2168_spi_read_write_byte(cmd);for(n=0;n<num;n++){  *(rec+n)=wk2168_spi_read_write_byte(0);   }wk2168_cs_high();//拉高cs信号}
}/*******WkInit*******************************************/
//函数功能:初始化子串口
/*******************************************************/
void wk2168_sub_uart_init(u8 port)
{u8 gena,grst,gier,sier,scr;//使能子串口时钟gena=wk2168_read_g_reg(WK2XXX_GENA);gena=gena|(1<<(port-1));wk2168_write_g_reg(WK2XXX_GENA,gena);//软件复位子串口grst=wk2168_read_g_reg(WK2XXX_GRST);grst=grst|(1<<(port-1));wk2168_write_g_reg(WK2XXX_GRST,grst);//使能串口总中断gier=wk2168_read_g_reg(WK2XXX_GIER);gier=gier|(1<<(port-1));wk2168_write_g_reg(WK2XXX_GIER,gier);//使能子串口接收触点中断和超时中断sier=wk2168_read_s_reg(port,WK2XXX_SIER); sier |= WK2XXX_RFTRIG_IEN|WK2XXX_RXOUT_IEN;wk2168_write_s_reg(port,WK2XXX_SIER,sier);//初始化FIFO和设置固定中断触点wk2168_write_s_reg(port,WK2XXX_FCR,0XFF);  //设置任意中断触点,如果下面的设置有效,//那么上面FCR寄存器中断的固定中断触点将失效wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1wk2168_write_s_reg(port,WK2XXX_RFTL,0X40);//设置接收触点为64个字节wk2168_write_s_reg(port,WK2XXX_TFTL,0X10);//设置发送触点为16个字节wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0 //使能子串口的发送和接收使能scr=wk2168_read_s_reg(port,WK2XXX_SCR); scr|=WK2XXX_TXEN|WK2XXX_RXEN;wk2168_write_s_reg(port,WK2XXX_SCR,scr);
}/******************************wk2168_sub_uart_deinit*******************************************/
//函数功能:初始化子串口
/*********************************************************************************/
void wk2168_sub_uart_deinit(u8 port)
{u8 gena,grst,gier;//关闭子串口总时钟gena=wk2168_read_g_reg(WK2XXX_GENA);gena=gena&(~(1<<(port-1)));wk2168_write_g_reg(WK2XXX_GENA,gena);//使能子串口总中断gier=wk2168_read_g_reg(WK2XXX_GIER);gier=gier&(~(1<<(port-1)));wk2168_write_g_reg(WK2XXX_GIER,gier);//软件复位子串口grst=wk2168_read_g_reg(WK2XXX_GRST);grst=grst|(1<<(port-1));wk2168_write_g_reg(WK2XXX_GRST,grst);}/**************************wk2168_set_baudrate*******************************************************/
//函数功能:设置子串口波特率函数、此函数中波特率的匹配值是根据11.0592Mhz下的外部晶振计算的
// port:子串口号
// baud:波特率大小.波特率表示方式,
/**************************Wk2114SetBaud*******************************************************/
void wk2168_set_baudrate(u8 port,enum WKBaud baud)
{  unsigned char baud1,baud0,pres,scr;//如下波特率相应的寄存器值,是在外部时钟为11.0592mhz的情况下计算所得,如果使用其他晶振,需要重新计算switch (baud) {case B600:baud1=0x4;baud0=0x7f;pres=0;break;case B1200:baud1=0x2;baud0=0x3F;pres=0;break;case B2400:baud1=0x1;baud0=0x1f;pres=0;break;case B4800:baud1=0x00;baud0=0x8f;pres=0;break;case B9600:baud1=0x00;baud0=0x47;pres=0;break;case B19200:baud1=0x00;baud0=0x23;pres=0;break;case B38400:baud1=0x00;baud0=0x11;pres=0;break;case B76800:baud1=0x00;baud0=0x08;pres=0;break;        case B1800:baud1=0x01;baud0=0x7f;pres=0;break;case B3600:baud1=0x00;baud0=0xbf;pres=0;break;case B7200:baud1=0x00;baud0=0x5f;pres=0;break;case B14400:baud1=0x00;baud0=0x2f;pres=0;break;case B28800:baud1=0x00;baud0=0x17;pres=0;break;case B57600:baud1=0x00;baud0=0x0b;pres=0;break;case B115200:baud1=0x00;baud0=0x05;pres=0;break;case B230400:baud1=0x00;baud0=0x02;pres=0;break;default:baud1=0x00;baud0=0x00;pres=0;}//关掉子串口收发使能scr=wk2168_read_s_reg(port,WK2XXX_SCR); wk2168_write_s_reg(port,WK2XXX_SCR,0);//设置波特率相关寄存器wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1wk2168_write_s_reg(port,WK2XXX_BAUD1,baud1);wk2168_write_s_reg(port,WK2XXX_BAUD0,baud0);wk2168_write_s_reg(port,WK2XXX_PRES,pres);wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0 //使能子串口收发使能wk2168_write_s_reg(port,WK2XXX_SCR,scr);
}
/**************************wk2168_get_tx_len*******************************************/
//函数功能:获取子串口发送FIFO剩余空间长度
// port:端口号
// 返回值:发送FIFO剩余空间长度
/**************************WK_Len********************************************/
int wk2168_get_tx_len(u8 port)
{u8 fsr,tfcnt;int len=0;fsr  =wk2168_read_s_reg(port,WK2XXX_FSR);tfcnt=wk2168_read_s_reg(port,WK2XXX_TFCNT);if(fsr& WK2XXX_TFULL){ len=0;}else{len=256-tfcnt;}return len;
}/**************************wk2168_send_data*******************************************/
//函数功能:通过子串口发送固定长度数据
// port:端口号
// len:单次发送长度不超过256
//
/**************************wk2168_send_data********************************************/
int wk2168_send_data(u8 port,int len,u8 *sendbuf)
{#if 1wk2168_write_s_fifo(port,sendbuf,len);//通过fifo方式发送数据
#elseint num=len;for(num=0;num<len;num++){wk2168_write_s_reg(port,WK2XXX_FDAT,*(sendbuf+num));}
#endif  return 0;
}/**************************wk2168_rec_data*******************************************/
//函数功能:读取子串口fifo中的数据
// port:端口号
// recbuf:接收到的数据
// 返回值:接收数据的长度
/**************************wk2168_rec_data********************************************/
int wk2168_rec_data(u8 port,u8 *recbuf)
{u8  fsr=0,rfcnt=0,rfcnt2=0,sifr=0;int len=0;sifr=wk2168_read_s_reg(port,WK2XXX_SIFR);if((sifr&WK2XXX_RFTRIG_INT)||(sifr&WK2XXX_RXOVT_INT))//有接收中断和接收超时中断{ fsr  =wk2168_read_s_reg(port,WK2XXX_FSR);rfcnt=wk2168_read_s_reg(port,WK2XXX_RFCNT);rfcnt2=wk2168_read_s_reg(port,WK2XXX_RFCNT);//printf("rfcnt=0x%x.\n",rfcnt);/*判断fifo中数据个数*/if(fsr& WK2XXX_RDAT){ if(!(rfcnt2>=rfcnt)){rfcnt=rfcnt2;}len=(rfcnt==0)?256:rfcnt;}
#if 1wk2168_read_s_fifo(port,recbuf,len);
#elsefor(n=0;n<len;n++)*(recbuf+n)=wk2168_read_s_reg(port,WK2XXX_FDAT);
#endif  return len;}else{len=0;return len;}
}/**************************wk2168_set_rs485*******************************************************/
//函数功能:设置子串口RS485的收发转换函数,使用RTS引脚控制485电平转换芯片的收发
// port:子串口号
//
//注意:只有WK2168/WK2204支持该功能
/**************************wk2168_set_rs485*******************************************************/
void wk2168_set_rs485(u8 port)
{   wk2168_write_s_reg(port,WK2XXX_RS485,0x02);////wk2168_write_s_reg(port,WK2XXX_RS485,0x03);//wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1wk2168_write_s_reg(port,WK2XXX_RTSDLY,0x01);wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
}
/**************************wk2168_rts_cts*******************************************************/
//函数功能:硬件自动流量控制,需要子设备的支持
// port:子串口号
//
//注意:只有WK2168/WK2204支持该功能
/**************************wk2168_rts_cts*******************************************************/
void wk2168_rts_cts(u8 port)
{   wk2168_write_s_reg(port,WK2XXX_FWCR,0x30);//wk2168_write_s_reg(port,WK2XXX_SPAGE,1);//切换到page1wk2168_write_s_reg(port,WK2XXX_FWTH,0XF0);//停止接收触点wk2168_write_s_reg(port,WK2XXX_FWTL,0X20);//继续接收触点wk2168_write_s_reg(port,WK2XXX_SPAGE,0);//切换到page0
}

四、完整工程下载

完整工程下载,请点击

STM32驱动WK2168串口扩展芯片完整教程相关推荐

  1. CH432,CH438,CH9434串口扩展芯片常见问题

    目前WCH有三款串口扩展芯片CH432,CH438以及CH9434. 型号 CH432 CH438 CH9434 扩展串口数量 2 8 4 通讯接口 并口/SPI(具体需要看芯片封装) 并口 SPI ...

  2. SJXXX串口扩展芯片 4串口芯片 UART串口芯片

    SJXX串口扩展芯片 1 概述 SJ000是一款具备I2C总线/SPI总线/UART接口的四通道异步收发器件,通过模式选择使得该器件工作于以上任何一种主接口模式下.器件的四个通道UART可提供高达2M ...

  3. stm32驱动Lora串口模块

    本文使用的硬件 stm32MCU+亿佰特-Lora串口模块,型号E32-433T20D 定义各配置字节 /*配置报文头部选项*/ #define HEAD_Save 0xC0//配置后掉电保存 #de ...

  4. WK串口扩展芯片思维图,最直观明了

    比如: 1.名称:WK2114-ISPG UART主接口的四通道异步收发器件 2. 名称:WK2124-ISSG , SPI桥接/扩展4个增强功能串口(UART) wk2114 将一个标准的 3 线异 ...

  5. usb转并口支持linux,并口转usb驱动怎么安装的打印机完整教程

    现在的笔记本电脑或者台式机都是没有再带并口输出了,一般打印机也全部都是由usb接口来传输的,但是如果遇到一些特别老的打印机需要并口怎么办呢?其实你只需要一根并口转usb线就行了,但不是直接连上就行,需 ...

  6. 基于一款 wk2168芯片的串口扩展

    串口扩展芯片应用介绍 一. 概述 随着嵌入式系统的功能越来越强大,搭载的外围设备也不断的增加,为了方便系统的集成,现在的外围设备通常都提供了标准的通信接口.在这些标准接口当中最常用的就是我们比较熟悉的 ...

  7. STM32驱动十个步进电机

    https://download.csdn.net/download/qq_36958104/12015084 程序链接 脉冲很正点   //stm32驱动步进电机 串口输出控制旋转角度 光电开关检测 ...

  8. stm32读取目标芯片_使用stm32驱动RC522读IC卡(代码留言邮箱)

    RC522与PN532简介 关于STM32驱动方式 接线说明 程序烧录 查看卡号 总结 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章,RC522与PN532在使用上都可 ...

  9. STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏

    STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏 串口屏 基础指令集 硬件和接线 接线 实验前准备 STM32程序 串口程序 主函数 实验现象 总结 串口屏 串口屏是一个集 ...

最新文章

  1. 【ACM】与全排列相关的STL函数 prev_permutation next_permutation
  2. ios 添加block 类别_ios之Block的详细使用和具体说明
  3. Set集合设置变量自增长
  4. 网易云信给您拜年啦!
  5. OS / Linux / pthread_cond_wait 为什么需要传递 mutex 参数?
  6. 郁金香汇编代码注入怎么写看雪_雷军1994年写的诗一样的代码,我把它运行起来了!...
  7. Apache2+PHP5不能加载Zend Optimizer的问题
  8. c/c++教程 - 1.2 变量、常量
  9. 一步一步学FRDM-KE02Z(一):IAR调试平台搭建以及OpenSDA两种工作模式设置
  10. notepad++正则表达式使用
  11. No.3小白的HTML+CSS心得篇
  12. RJ45转COM线序关系
  13. Bytes和bits的区别(字节和位的区别)
  14. 苹果IOS9为加强个人隐私信息保护强制HTTPS,APP开发者需申请SSL证书
  15. 券商接口量化交易策略——KDJ指标
  16. 显卡 内存分配 linux,【原创】Linux环境下的图形系统和AMD R600显卡编程(4)——AMD显卡显存管理机制...
  17. u盘引导 在SSD+HHD配置下安装ubuntu16.04
  18. 50、诗句按照特定个数输出
  19. 服务器客服获取小程序头像,微信小程序自动获取微信用户头像
  20. Could not copy property 'intro' from source to target; nested exception is java.lang.reflect.Invocat

热门文章

  1. Sigmoid 函数的求导过程
  2. elasticsearch相同两次搜索出现不一样的结果
  3. 教你用scratch2.0编见缝插针游戏
  4. 逻辑回归预测瘀血阻络证||LogRegression 二分类 python3|五折交叉验证
  5. layui 单元格事件
  6. 【知识分享】C语言中的设计模式——命令模式
  7. 2.使用Gateway实现token校验
  8. 一文搞懂SOLID原则(javascript)
  9. 常见锁的区别及适用场景
  10. 看过这样一个纪录片吗《父亲》,令人深思