STM32F407用wk2124芯片编写SPI转四路串口驱动

2023-05-16


目录

引言

一. SPI通信配置

1.GPIO初始化设置

2.SPI参数配置

3.读写函数

4.速度设置

二、WK2124逻辑代码编写

1.片选初始化

2. 写寄存器函数

3. 读寄存器函数

4. 写FIFO函数

5.读FIFO函数

6. WK2124初始化函数

7.wk2124关闭及复位函数

8. 波特率设置函数

8.发送字节函数

9. 接收数据函数

三、测试


引言

因为项目用到了wk2124芯片来进行串口扩展,网上找了好多资料没有现成的,根据商家提供的demo,它是基于103写的,所以根据自己板子的实际情况进行了改写,并且学习一下里面的主要函数及我对函数的理解

原理图

 用到5个引脚,片选CS、时钟SCK、MOSI、MISO和中断IRQ,因为RST设置的是板子连电后电容充电,所以会自动复位,不用这个引脚。

一. SPI通信配置

1.GPIO初始化设置

  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能SPI2时钟,在APB1时钟里面
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  //PB13-15分别复用为SCK,MISO,MOSI
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化

  GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);

2.SPI参数配置

 

 

 

因为发送接收是同时进行,所以选择全双工,SPI设置为主模式 ,大小为8bit,时钟默认拉低,第二个时钟沿开始捕捉,数据格式SPI_FirstBit(选择是MSB还是LSB),选择MSB方式,举个例子假设用16bit,就是[15,0]这样,如果是LSB就是[0,15]这样。


	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //SPI设置为双线双向全双工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//设置为主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;		//时钟悬空低
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;	//数据捕获于第二个时钟沿
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		//NSS信号由软件(使用SSI位)管理
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;	//定义波特率预分频的值:波特率预分频值为256
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//数据传输从MSB位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRC值计算的多项式
	SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
	SPI_Cmd(SPI2, ENABLE); //使能SPI外设
	SPI2_ReadWriteByte(0xff);//启动传输

3.读写函数

u8 SPI2_ReadWriteByte(u8 TxData)
{		
	u8 retry=0;				 	
	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //发送缓存空标志位
		{
		retry++;
		if(retry>200)return 0;
		}			  
	SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
	retry=0;

	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)//接受缓存非空标志位
		{
		retry++;
		if(retry>200)return 0;
		}	  						    
	return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据					    
}

读写函数中,用SPI_I2S_GetFlagStatus不断去获取TXE和RXNE的状态,如果是非空就继续,如果为空就调用Send和Rece函数去发送接收数据,当retry标志连续超过200次,就返回0,发送/接收失败。

4.速度设置

void SPI2_SetSpeed(u8 SpeedSet)
{
	SPI_InitStructure.SPI_BaudRatePrescaler = SpeedSet ;
    SPI_Init(SPI2, &SPI_InitStructure);
	SPI_Cmd(SPI2,ENABLE);
} 

 

二、WK2124逻辑代码编写

引脚对应关系

CS    PB12
SCK   PB13
MOSI  PB15
MISO  PB14
IRQ   PB1

 

1.片选初始化

void SPI_CS_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);		 //使能PB端口时钟
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;	//PB12端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出	
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;		 //IO口速度为100MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB12
 GPIO_SetBits(GPIOB,GPIO_Pin_12);						 //PB12 输出高	
}

 

2. 写寄存器函数

void WK2124WriteReg(unsigned char port,unsigned char reg,unsigned char dat)
{	 
	 SPI_CS_L();//片选使能
	 SPI2_ReadWriteByte(((port-1)<<4)+reg); //写控制字节
	 SPI2_ReadWriteByte(dat); //写数据
	 SPI_CS_H();//片选无效
}

首先把片选信号拉低,然后写入控制命令,再写入数据,写完之后再拉高片选,对于其中的控制字节((port-1)<<4)+reg可以根据数据手册得知,port:为子串口的端口号(C0\C1),reg是目标寄存器,dat是数据。

6,7位为默认为0,0,C1,C0为串口通道,可选值为00,01,10,11分别表示4个串口,默认设置为00,通过传入参数port(port设置的是1,2,3,4,但是因为从0开始,所以要port-1)来进行改变,然后左移4位变成00 0000,然后加上初始的默认值0000 0000,最后加上要写入的寄存器,所以其实是0x00+(port-1)<<4)+reg,然后将这个cmd传入spi读写函数进行读写。

 

3. 读寄存器函数

unsigned char WK2124ReadReg(unsigned char port,unsigned char reg)
{	
	unsigned char rec_data; 
	SPI_CS_L();	//片选使能
	SPI2_ReadWriteByte(0x40+((port-1)<<4)+reg);//写控制字节
	rec_data=SPI2_ReadWriteByte(0);//接收返回的数据
	SPI_CS_H();	//片选无效	
	return rec_data;
}

4. 写FIFO函数

void WK2124WriteFifo(unsigned char port,unsigned char *wbuf,unsigned int len)
{	 unsigned char n;
	 SPI_CS_L(); // 片选有效
	 SPI2_ReadWriteByte(0x80+((port-1)<<4)); //写FIFO控制指令
	  for(n=0;n<len;n++)
	  {
	     SPI2_ReadWriteByte(*(wbuf+n));
		} 
	 SPI_CS_H();	//片选无效

}

  port:为子串口的端口号(C0\C1), *wbuf:写入数据部分, len:  写入数据长度。

大部分和读写寄存器相同,主要控制字节不同,其次可以一次写入多个数据。

控制字节的变化主要是初始SPI的CMD为1000 0000,也就是0x80,其他一样。

 

5.读FIFO函数

void WK2124WriteFifo(unsigned char port,unsigned char *wbuf,unsigned int len)
{	 unsigned char n;
	 SPI_CS_L(); // 片选有效
	 SPI2_ReadWriteByte(0x80+((port-1)<<4)); //写FIFO控制指令
	  for(n=0;n<len;n++)
	  {
	     SPI2_ReadWriteByte(*(wbuf+n));
		} 
	 SPI_CS_H();	//片选无效

}

 

6. WK2124初始化函数

首先使能子串口时钟


    unsigned char gena,grst,gier,sier,scr;
	//使能子串口时钟
    gena=WK2124ReadReg(WK2124_GPORT,WK2124_GENA); 
	switch (port)
    {
          case 1://使能子串口1的时钟
              gena|=WK2124_UT1EN;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GENA,gena);
              break;
		  case 2://使能子串口2的时钟
              gena|=WK2124_UT2EN;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GENA,gena);
              break;
		   case 3://使能子串口3的时钟
              gena|=WK2124_UT3EN;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GENA,gena);
              break;
		   case 4://使能子串口4的时钟
              gena|=WK2124_UT4EN;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GENA,gena);
              break;
	 }	
	

在头文件中对GENA全局寄存器进行了宏定义:

#define 	WK2124_UT4EN	0x08
#define 	WK2124_UT3EN	0x04
#define 	WK2124_UT2EN	0x02
#define 	WK2124_UT1EN	0x01

根据数据手册说明,低位的0,1,2,3位置1,就使能哪个子串口,如ut2使能就是0000 0010,也就是0x02。

接下来进行串口复位

//软件复位子串口
	grst=WK2124ReadReg(WK2124_GPORT,WK2124_GRST); 
	switch (port)
    {
          case 1://软件复位子串口1
              grst|=WK2124_UT1RST;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GRST,grst);
              break;
		  case 2://软件复位子串口2
              grst|=WK2124_UT2RST;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GRST,grst);
              break;
		   case 3://软件复位子串口3
              grst|=WK2124_UT3RST;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GRST,grst);
              break;
		   case 4://软件复位子串口4
             grst|=WK2124_UT4RST;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GRST,grst);
              break;
	 }	
 

与上面一样,第四位哪个置1,表示哪个子串口进行复位。 

接下来使能串口中断

 //使能子串口中断,包括子串口总中断和子串口内部的接收中断,和设置中断触点
	gier=WK2124ReadReg(WK2124_GPORT,WK2124_GIER); 
	switch (port)
    {
          case 1://子串口1中断使能
              gier|=WK2124_UT1IE;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GIER,gier);
              break;
		  case 2://子串口2中断使能
              gier|=WK2124_UT2IE;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GIER,gier);
              break;
		   case 3://子串口3中断使能
              gier|=WK2124_UT3IE;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GIER,gier);
              break;
		   case 4://子串口4中断使能
              gier|=WK2124_UT4IE;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GIER,gier);
              break;
	 }	 
	

寄存器设置与上面一样。

     //使能子串口接收触点中断和超时中断
	 sier=WK2124ReadReg(port,WK2124_SIER); 
	 sier |= WK2124_RFTRIG_IEN;
	 WK2124WriteReg(port,WK2124_SIER,sier);
	 // 初始化FIFO和设置固定中断触点
	 WK2124WriteReg(port,WK2124_FCR,0XFF);
	 //设置任意中断触点,如果下面的设置有效,那么上面FCR寄存器中断的固定中断触点将失效
	 WK2124WriteReg(port,WK2124_SPAGE,1);//切换到page1
	 WK2124WriteReg(port,WK2124_RFTL,0X08);//设置接收触点8个字节
	 WK2124WriteReg(port,WK2124_TFTL,0X10);//设置发送触点为16个字节
	 WK2124WriteReg(port,WK2124_SPAGE,0);//切换到page0 
	 //使能子串口的发送和接收使能
	 scr=WK2124ReadReg(port,WK2124_SCR); 
	 scr|=WK2124_TXEN|WK2124_RXEN;
	 WK2124WriteReg(port,WK2124_SCR,scr);

 

剩下的这些触点,页面设置,使能都一样,根据数据手册进行设置即可。

 

7.wk2124关闭及复位函数

void WK2124Close(unsigned char port)
{
    unsigned char gena,grst;
	//复位子串口
	grst=WK2124ReadReg(WK2124_GPORT,WK2124_GRST); 
	switch (port)
    {
          case 1://软件复位子串口1
              grst|=WK2124_UT1RST;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GRST,grst);
              break;
		  case 2://软件复位子串口2
              grst|=WK2124_UT2RST;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GRST,grst);
              break;
		   case 3://软件复位子串口3
              grst|=WK2124_UT3RST;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GRST,grst);
              break;
		   case 4://软件复位子串口4
              grst|=WK2124_UT4RST;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GRST,grst);
              break;
	 }	
	//关闭子串口时钟
    gena=WK2124ReadReg(WK2124_GPORT,WK2124_GENA); 
	switch (port)
    {
          case 1://使能子串口1的时钟
              gena&=~WK2124_UT1EN;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GENA,gena);
              break;
		  case 2://使能子串口2的时钟
              gena&=~WK2124_UT2EN;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GENA,gena);
              break;
		   case 3://使能子串口3的时钟
              gena&=~WK2124_UT3EN;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GENA,gena);
              break;
		   case 4://使能子串口4的时钟
              gena&=~WK2124_UT4EN;
		      WK2124WriteReg(WK2124_GPORT,WK2124_GENA,gena);
              break;
	 }	
}

先对GRST寄存器进行操作使其复位,然后利用~运算符关闭串口时钟,同时可以减少参数量。

 

8. 波特率设置函数

void WK2124SetBaud(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=WK2124ReadReg(port,WK2124_SCR); 
	WK2124WriteReg(port,WK2124_SCR,0);
	//设置波特率相关寄存器
	WK2124WriteReg(port,WK2124_SPAGE,1);//切换到page1
	WK2124WriteReg(port,WK2124_BAUD1,baud1);
	WK2124WriteReg(port,WK2124_BAUD0,baud0);
	WK2124WriteReg(port,WK2124_PRES,pres);
	WK2124WriteReg(port,WK2124_SPAGE,0);//切换到page0 
	//使能子串口收发使能
	WK2124WriteReg(port,WK2124_SCR,scr);
	
	
}

计算公式:

Reg整数部分减一并换算成16进制写入{BAUD1,BAUA0};如果还有小数部分,则小数部分*16,然后4舍5入后取整写入PRES。如果没有小数部分,只需把整数部分写入 { BAUD1,BAUA0},PRES写入0即可。

例子:

根据具体晶振去设置即可。

 

8.发送字节函数

unsigned int WK2124SendBuf(unsigned char port,unsigned char *sendbuf,unsigned int len)
{
	 unsigned int ret,tfcnt,sendlen;
	 unsigned char  fsr;
	  
	 fsr=WK2124ReadReg(port,WK2124_FSR);
	 if(~fsr&WK2124_TFULL )//子串口发送FIFO未满
	 {

	     tfcnt=WK2124ReadReg(port,WK2124_TFCNT);//读子串口发送fifo中数据个数
		 sendlen=256-tfcnt;//FIFO能写入的最多字节数
		 
		 if(sendlen<len)
		 {
			ret=sendlen; 
			WK2124WriteFifo(port,sendbuf,sendlen);
		 }
		 else
		 {
			 WK2124WriteFifo(port,sendbuf,len);
			 ret=len;
		 }
	  }
	 
	 return ret;
}

 

9. 接收数据函数

unsigned int WK2124GetBuf(unsigned char port,unsigned char *getbuf)
{
	unsigned int ret=0,rfcnt;
	unsigned char fsr;
	fsr=WK2124ReadReg(port,WK2124_FSR);
	if(fsr&WK2124_RDAT )//子串口发送FIFO未满
	  {
	     rfcnt=WK2124ReadReg(port,WK2124_RFCNT);//读子串口发送fifo中数据个数
		 if(rfcnt==0)//当RFCNT寄存器为0的时候,有两种情况,可能是256或者是0,这个时候通过FSR来判断,如果FSR显示接收FIFO不为空,就为256个字节
		 {rfcnt=256;}
		 WK2124ReadFifo(port,getbuf,rfcnt);
		 ret=rfcnt;
	   }
	 return ret;	
}

      最后有一点,UART端口输出为TTL电平,如果需要232或485电平的,需要加相应的电平转换芯片。

      踩坑记录:如果读写寄存器是0的情况下,将芯片的子串口短接,进行自收发测试,如果成功就说明子串口到外接的通信有问题,如果失败就说明2124和主控芯片之间的通信有问题,检查一下通信过程。

我有一步是SPI配置的时候预分频给了256,太大了导致通信失败,将它改为8分频。

要看一下SPI的CPOL,CPHA,应该在LOW状态捕捉第一个边沿,参考数据手册,否则的话也是收发有问题。

不同频率的晶振记得根据公式改写波特率,否则通信有问题。

还有好多坑,想不起来了。

三、测试

配置好后4个串口测试:

单个字符/数

 

字符写入测试:

进行两次写入观察,写入的一致。

 

FIFO串口4与STM32串口1通信测试:

 

数据缓存区测试 :

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F407用wk2124芯片编写SPI转四路串口驱动 的相关文章

  • I2C总线和SPI总线

    I2C串行总线一般有两根信号线 xff0c 一根是双向的数据线SDA xff0c 另一根是时钟线SCL I2C协议 2条双向串行线 xff0c 一条数据线SDA xff0c 一条时钟线SCL SDA传输数据是 大端传输 xff08 字节高位
  • 亲测+STM32F407+freertos+cumax+串口空闲中断和can接收发送

    STM32F407 freertos cumax 串口空闲中断和can接收发送 本人最近再学习使用cumax软件搭建stm32f4的freertos系统 废话不多说 首先介绍一下主要的硬件和软件配置 Cumax 采用Version6 1 1
  • 什么是SPI通信

    ARM体系 SPI通信 一 什么是SPI通信 1 SPI是串行外设接口 Serial Peripheral Interface xff0c 可以理解为一种通信协议 xff0c 也就是用来传输数据的 2 SPI 是由摩托罗拉 Motorola
  • SPI总线协议基本原理及相关配置

    单片机应用中 xff0c 最常用的通信协议主要有三个 xff0c 即USART IIC和SPI 关于前两个的介绍在之前文章学习过 xff0c 这次介绍一下第三个通信协议 SPI SPI Serial Peripheral Interface
  • STM32F407 串口编程USART1,USART2,USART3,UART4

    串口设置的一般步骤可以总结为如下几个步骤 xff1a 1 串口时钟使能 xff0c GPIO时钟使能 2 设置引脚复用器映射 xff1a 调用GPIO PinAFConfig函数 3 GPIO初始化设置 xff1a 要设置模式为复用功能 4
  • SPI接口原理与配置

    SPI接口简介 SPI是英语Serial Peripheral interface的缩写 顾名思义就是串行外围设备接口 是Motorola首先在其MC68HCXX系列处理器上定义的 SPI是一种高速的 全双工 同步的通信总线 并且在芯片的管
  • SPI通讯协议介绍

    来到SPI通讯协议了 废话两句 xff0c SPI很重要 xff0c 这是我在学校时候听那些单片机开发工程师说的 出来实习 xff0c 到后来工作 xff0c 确实如此 xff0c SPI的使用很常见 xff0c 那么自然重要咯 SPI S
  • SPI基础概念

    文章目录 目的 物理接线 极性和相位 信号时序 总结 目的 SPI Serial Perripheral Interface 是一种非常常用的全双工接口 这个接口在非常简单的机制下达到了比较高的通讯速度 比它通讯速度更高的常见的要不是并口
  • 成功解决keil识别不到单片机芯片,下载不了程序

    成功解决keil识别不到单片机芯片 下载不了程序 我的芯片是STM32F429 正点原子的阿波罗 今天使用开发板做实验 突然找不到芯片了 以前下载的PWM波也运行不了 查找了好久 原来是芯片锁了 终于解决了 我是第二种办法实现给芯片解锁的
  • STM32F103C8T6单片机IAP升级

    关于IAP升级的方法和原理 网上已经有很多资料了 这块就不再说了 现在就将bootloader和app配置方法整理如下 APP程序就是一个简单的LED闪烁 APP设置为从FLASH中启动 STM32F103C8T6单片机flash有64K
  • 沁恒CH32V307使用记录:SPI基础使用

    文章目录 目的 基础说明 使用演示 其它补充 总结 目的 SPI是单片机中比较常用的一个功能 这篇文章将对CH32V307中相关内容进行说明 本文使用沁恒官方的开发板 CH32V307 EVT R1沁恒RISC V模块MCU赤兔评估板 进行
  • STM32F407+ESP8266连接机智云过程详解

    工程创建 代码调试过程参见 STM32F407 ESP8266 程序源码下载 STM32F407 ESP8266连接机智云程序源码
  • 各种通信接口的简单对比

    对比表 同步方式与异步方式的主要区别在于 是否传输时钟信号 只要是通訊前雙方需要設定相同波特率的 都是異步傳輸方式 异步传输 Asynchronous Transmission 每次异步传输的信息都以一个起始位开头 它通知接收方数据已经到达
  • SPI接口详细介绍

    1 概述 SPI Serial Peripheral Interface 是串行外围设备接口 是一种高速 全双工 同步的通信总线 常规只占用四根线 节约了芯片管脚 PCB的布局省空间 现在越来越多的芯片集成了这种通信协议 常见的有EEPRO
  • Linux SPI 总线 和设备驱动架构之三:SPI控制器驱动

    通过第一篇文章 我们已经知道 整个SPI驱动架构可以分为协议驱动 通用接口层和控制器驱动三大部分 其中 控制器驱动负责最底层的数据收发工作 为了完成数据收发工作 控制器驱动需要完成以下这些功能 1 申请必要的硬件资源 例如中断 DMA通道
  • spi,ClassLoader,双亲委托模式

    转载 https www cnblogs com hiyujie p wo xueJava1ClassLoader yu shuang qin wei tuo mo sh html 1 ClassLoader分类 Java虚拟机会创建三类C
  • 搭建STM32F407的SPI-Flash(基于STM32CubeMX)

    网上有不少例子 都对 但对我来说碰到几个坑 避免以后再犯错 mark下 目标 通过SPI接口 对Nor Flash进行读写 开发板上Nor Flash 是W25Q128 128Mbit 也就是16MB样子 CubeMx端配置 配置要分两个
  • CH347读写SPI Flash

    前面耽搁了几天 今天终于把CH347 SPI接口调试好了 CH347动态库中SPI接口函数如下 typedef struct SPI CONFIG UCHAR iMode 0 3 SPI Mode0 1 2 3 UCHAR iClock 0
  • Linux,spidev:为什么它不应该直接在设备树中?

    我想定义一个具有用户模式访问权限的 SPI 设备 如中所述http linux sunxi org SPIdev 按照这些示例 我在设备树中添加了以下内容 ecspi1 other stuff mydev 0 compatible spid
  • 树莓派 pico rfid rc522 (Micropython)

    我想使用 RPi Pico 从 mfrc522 Iduino RFID rc522 读卡器读取数据 但我不知道如何操作 我试图使用为此目的制作的 mfrc522 py MicroPython 库 阅读器正在通过 SPI 与 Pi 通信 我将

随机推荐

  • Github快速查找资源常用筛选命令

    1 按项目名称 仓库名称搜索 xff08 不区分大小写 xff09 命令 in name xxx 示范 xff1a in name tensorflow 2 按照readme搜索 xff08 不区分大小写 xff09 命令 in readm
  • STM32F407-定时器中断

    1 通用定时器工作流程 2 时钟来源 定时器有4个时钟源 xff0c 分别为 xff1a 内部时钟 CK INT 外部时钟模式1 xff1a 外部输入脚 TIx 外部时钟模式2 xff1a 外部触发输入 ETR 仅适用TIM2 3 4 内部
  • STM32F407-获取GPIO电平状态

    判断STM32 GPIO输入口的输入状态 xff08 高电平或低电平 xff09 以PE2和PE4为例 xff1a 判断单个端口是否为高电平 xff1a if GPIOE gt IDR amp GPIO IDR IDR2 函数体 xff1b
  • STM32F407-限位金属传感器限制步进电机

    一 硬件 1 硬件准备 xff1a 57步进电机 xff08 型号57CM18 xff09 xff0c 42步进电机 xff0c 驱动器TB6600 xff0c 开发板STM32F407ZGT6 xff0c SN 4NDO限位金属传感器 x
  • MobileNet学习记录-概念篇

    MobileNet 1 网络简介 MobileNet模型是Google公司近年来提出的一种轻量级深度神经网络 xff0c 主要用于移动和嵌入式平台开发使用 MobileNets主要是从最初引入的深度可分离卷积构建的 xff0c 并随后用于I
  • Node将JS与Puppeteer打包成exe使用

    pkg pkg是一个可以将nodejs代码打包封装成可执行文件的工具 xff0c 安装命令如下 xff1a npm install g pkg 打包命令如 xff1a 默认会打包三个平台的可执行文件 xff0c win mac linux
  • Ubuntu 连接 wifi -亲测可用

    连接wifi 修改 etc network interfaces 文件 这个文件是定义网络配置的 sudo vim etc network interfaces interfaces 修改后文件内容如下 xff1a auto eth0 if
  • 卷积神经网络CNN学习记录-概念篇

    卷积神经网络CNN 1 网络简介 卷积神经网络 xff08 Convolutional Neural Network xff09 是人工神经网络与深度学习相结合 xff0c 它是一种具有卷积计算并且具有深度结构的前馈神经网络经 xff0c
  • 卷积神经网络CNN学习记录-实战篇(Minst手写数据集识别)

    from tensorflow examples tutorials mnist import input data import tensorflow as tf minst 61 input data read data sets 34
  • 卷积神经网络CNN学习记录-CNN实现语义分割(Encoder-Decoder结构)

    1 Encoder from keras layers import def Conv Encoder input height 61 416 input width 61 416 Img In 61 Input shape 61 inpu
  • MobileNet学习记录-基于MobileNetV1的自动驾驶图像语义分割实现

    1 MobileNet基础及架构 Mobielnet学习记录 概念篇 2 实现思路 为了便于实现 xff0c 还是采用了Encoder Decoder结构 xff0c 利用MobileNet来进行特征提取 xff0c 相较于CNN的卷积操作
  • STM32F407-SPI通信接口

    1 SPI概念 SPI xff0c 是一种高速的 xff0c 全双工 xff0c 同步的通信总线 xff0c 并且在芯片的管脚上只占用四根线 xff0c 节约了芯片的管脚 xff0c 同时为PCB的布局上节省空间 xff0c 提供方便 xf
  • Python学习-变量类型

    1 单变量赋值 等号 xff08 61 xff09 用来赋值 xff0c 左边是一个变量名 xff0c 右边是存储在变量中的值 xff0c 定义变量不需要声明类型 xff0c 可以直接赋值使用 例 xff1a temp1 61 100 赋值
  • Python学习-条件循环

    1 while循环 while循环的语句格式为 xff1a while condition statements 当判断条件为真时 xff0c 就会执行循环中的语句 xff0c 当条件为假时退出循环 xff0c 若条件为一个永真式 xff0
  • Python学习-函数模块

    1 函数定义 定义规则 xff1a 函数代码块以 def 关键词开头 xff0c 后接函数标识符名称和圆括号 任何传入参数和自变量必须放在圆括号中间 圆括号之间可以用于定义参数 函数的第一行语句可以选择性地使用文档字符串 用于存放函数说明
  • STM32F407控制42,57两个步进电机用传感器限制位置

    功夫不负有心人 xff0c 终于把这个做出来了 xff0c 本项目为控制42 57两个步进电机 xff0c 带动齿轮 xff0c 进行上下左右转动 xff0c 四个限位金属传感器限制位置 传感器配置过程 步进电机配置过程 记录一下一个问题
  • Python学习-多线程

    1 线程 首先区分线程和进程两个概念 xff1a 进程是资源 xff08 CPU 内存等 xff09 分配的基本单位 xff0c 它是程序执行时的一个实例 程序运行时系统就会创建一个进程 xff0c 并为它分配资源 xff0c 然后把该进程
  • Spring MVC controller出错后进入了不该进入的拦截器

    拦截器对一些接口进行了排除 xff0c 使这些接口不用进入拦截器的验证 xff0c 但是出现了一个现象 xff0c 例如 api v1 auth register 这个接口 xff0c 如果因为某些原因 xff0c 出现异常了 xff0c
  • Git学习-本地仓库与版本管理

    一 创建仓库 1 创建空仓库 在合适的位置创建一个新目录 xff0c Git Bash支持的是linux命令操作 第一种方法 xff1a mkdir mygit cd mygit pwd 用mkdir创建目录 xff0c pwd查看当前路径
  • STM32F407用wk2124芯片编写SPI转四路串口驱动

    目录 引言 一 SPI通信配置 1 GPIO初始化设置 2 SPI参数配置 3 读写函数 4 速度设置 二 WK2124逻辑代码编写 1 片选初始化 2 写寄存器函数 3 读寄存器函数 4 写FIFO函数 5 读FIFO函数 6 WK212