回顾前面用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。
开始接线:
屏幕 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 }
~
~ 问题依旧
那就这样吧。。。。。