历史上的今天
今天是:2024年09月16日(星期一)
2019年09月16日 | STM32之SPI的迭代
2019-09-16 来源:eefocus
回顾前面用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 2 int A,B; 3 #define wm(a) a?A:B 4 void main() 5 { 6 printf("%dt%dn",A,B); 7 wm(1)=3; 8 printf("%dt%dn",A,B); 9 }报错!左值是常量!!!! 1 #include 2 int A,B,C; 3 #define wm(a) (a)?(A):(B) 4 void main() 5 { 6 printf("%dt%dt%dn",A,B,C); 7 C=wm(1); 8 printf("%dt%dt%dn",A,B,C); 9 }可以的 成功执行!!! 1 #include 2 int A,B,C; 3 #define wm(a) A 4 void main() 5 { 6 printf("%dt%dn",A,B); 7 wm(1)=3; 8 printf("%dt%dn",A,B); 9 } ~ 可以的 1 #include 2 int A,B,C; 3 #define wm(a) C=a?A:B 4 void main() 5 { 6 printf("%dt%dn",A,B); 7 wm(1)=3; 8 printf("%dt%dn",A,B); 9 }问题依旧 ~ ~ 1 #include 2 int A,B,C; 3 #define wm(a,A,B) (a)?(A):(B) 4 void main() 5 { 6 printf("%dt%dn",A,B); 7 wm(1,A,B)=3; 8 printf("%dt%dn",A,B); 9 } ~ ~ 企图传参进去 问题依旧 1 #include 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("%dt%dn",A,B); 7 C=wm(1,1); 8 printf("%dt%dn",A,B); 9 } ~ ~ 问题依旧 那就这样吧。。。。
史海拾趣
|
开关电源基于补偿原理的无源共模干扰抑制技术 摘要:介绍了一种基于补偿原理的共模干扰抑制技术,通过抑制电源辐射来减少变换器的共模干扰。这种方法被推广应用于多种功率变换器拓扑,理论和实验结果都表明该技术有效减少了电路的共模 ...… 查看全部问答> |
|
我最近参加了IEEE电磁兼容性(EMC)学会的一个本地(西雅图)会议,这并不是我所居住的地方,但我极力向你推荐,在这里你可以了解更多的EMC的基本知识,还可以获取大量的免费建议。 听完Bill Ritenour关于汽油泵的静电屏蔽的演讲之后,我们开始 ...… 查看全部问答> |
|
我想请教各位大大 我正在写一个关于时间和频率最大相似估测的程式 他里面有个方块图是这样的 ρ/2 〖|.|〗^2 我知道ρ的运算过程是这样的... ρ= (E{〖|s(k)|〗^2})/(E{|〖s(k)〗^2 | }+E{|〖w(k)〗^2 |})=(σ_s^2)/(σ_s^2+σ_w^2 )=SNR/(SNR ...… 查看全部问答> |
|
上午去买了几个新的红外接收管 回来写了个小程序测试,接收管接收到红外信号就会输出一个低信号,然后MCU就控制一个红灯亮一下 开始我用电视遥控器试发现红灯亮的和我按的不一致,不是我按了它不亮就是我没按它却亮了, 后来发现原来我只要用手一 ...… 查看全部问答> |
|
使用MSP430F247做项目。在生产过成中,发现有些机器反复拔插电源后,系统没反应。用仿真器读出MSP430F247的程序,发现0X8000-0X81FF的程序全部被清成0XFF。反应给FAE,他们说可能是复位时序不对进入了BSL。可是之前的产品都没有发现这个问题。 另 ...… 查看全部问答> |
|
大家好! 我们用MC9S08QE32发现串口数据紊乱,但是用MC9S08QE128发现程序正常,请问大家是什么原因? 下面是我们的测试代码: unsigned char *string1=\" Welcome \\r\\n\"; MCU_Init(); ...… 查看全部问答> |




