STM32之SPI的迭代

回顾前面用SPI2写的一个W25Q64的程序


void SPI2_Init(void)
{	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

 	GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉
void W25QXX_Init(void)
{	
        GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOG, ENABLE );//PORTB时钟使能 

	GPIO_InitStructure.GPIO_Pin = CS_GPIOPIN;  
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(CS_GPIO, &GPIO_InitStructure);
#define CS_GPIO       GPIOG
#define CS_GPIOPIN    GPIO_Pin_1
可以看到用到的4根线的层次是不同的。PB13 PB14 PB15用于SPI通讯的时钟和数据,而片选是单独的,是PG1


现在我们仔细看看淘宝买的这个屏幕。它其实有3个SPI设备

触控屏

SD卡

Flash

现在试试改动前面的SPI程序,在做一个新的吧。


看屏幕的部分,也是SPI2:可以看到用到的4根线的层次是不同的。PB13 PB14 PB15用于SPI通讯的时钟和数据,而片选是单独的,是PB12。


扫描二维码关注公众号,回复: 1814227 查看本文章

开始接线:

屏幕     MCU

MOSI   B15

MISO  B14

CLK     B13

F_CS    B12


软件发现只需要修改配置就可以直接work

//用SPI2也就是PB13-14-15和PG1作为CS驱动flash 可读可写
//移植修改部分
#define CS_GPIO       GPIOB
#define CS_GPIOPIN    GPIO_Pin_12
#define	W25QXX_CS 		PBout(12)  		//W25QXX的片选信号

//#define CS_GPIO       GPIOG
//#define CS_GPIOPIN    GPIO_Pin_1
//#define	W25QXX_CS 		PGout(1)  		//W25QXX的片选信号


现在我们来做另外一个事情:

主机有多个SPI设备,比如我MCU现在就有2个FLASH 我要分开操作了。

格局有点大,我们现在做小一点。主要是PICK那一个,也就是片选这个函数你用哪个脚。

改动1

#define CS_GPIO                GPIOB
#define CS_GPIOPIN             GPIO_Pin_12
#define	W25QXX_CS(a) 		a?PBout(12):PGout(1) 		//W25QXX的片选信号

#define CS_GPIO2       GPIOG
#define CS_GPIOPIN2    GPIO_Pin_1

主要是现在我传参进去W25QXX_CS(a)   传1的话代表是屏幕上电FLASH  传0的话代表的是板上的FLASH

改动2

	GPIO_InitStructure.GPIO_Pin = CS_GPIOPIN;  
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_InitStructure.GPIO_Pin = CS_GPIOPIN2; 
 	GPIO_Init(CS_GPIO2, &GPIO_InitStructure);

两个设备的CS都要init。

出问题卡住了:

#define W25QXX_CS(a) (a?PBout(12):PGout(1)) //W25QXX的片选信号

这样定义以后,编译失败


这是C语言的知识。

  1 #include<stdio.h>
  2 int A,B;
  3 #define wm(a)   a?A:B
  4 void main()
  5 {
  6  printf("%d\t%d\n",A,B);
  7  wm(1)=3;
  8  printf("%d\t%d\n",A,B);
  9 }报错!左值是常量!!!!
  1 #include<stdio.h>
  2    int A,B,C;
  3    #define wm(a)   (a)?(A):(B)
  4    void main()
  5    {
  6     printf("%d\t%d\t%d\n",A,B,C);
  7     C=wm(1);
  8     printf("%d\t%d\t%d\n",A,B,C);
  9    }可以的 成功执行!!!

  1 #include<stdio.h>
  2 int A,B,C;
  3 #define wm(a)  A
  4 void main()
  5 {
  6  printf("%d\t%d\n",A,B);
  7  wm(1)=3;
  8  printf("%d\t%d\n",A,B);
  9 }
~      可以的
 1 #include<stdio.h>
  2 int A,B,C;
  3 #define wm(a) C=a?A:B
  4 void main()
  5 {
  6  printf("%d\t%d\n",A,B);
  7  wm(1)=3;
  8  printf("%d\t%d\n",A,B);
  9 }问题依旧
~                                                                               
~      
  1 #include<stdio.h>
  2 int A,B,C;
  3 #define wm(a,A,B)  (a)?(A):(B)
  4 void main()
  5 {
  6  printf("%d\t%d\n",A,B);
  7  wm(1,A,B)=3;
  8  printf("%d\t%d\n",A,B);
  9 }
~                                                                               
~       企图传参进去 问题依旧

1 #include<stdio.h>
  2 int A,B,C;
  3 #define wm(choice,value)  (choice)?((value?A=1:A=0)):(value?B=1:B=0)
  4 void main()
  5 {
  6  printf("%d\t%d\n",A,B);
  7 C=wm(1,1);
  8  printf("%d\t%d\n",A,B);
  9 }
~                                                                               
~      问题依旧


那就这样吧。。。。。

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/80830993