历史上的今天
返回首页

历史上的今天

今天是: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 }

~                                                                               

~      问题依旧



那就这样吧。。。。

推荐阅读

史海拾趣

Antiference公司的发展小趣事

随着技术的不断进步,Antiference公司开始将目光投向国际市场。公司积极参与国际电子展,展示其先进的电磁干扰抑制技术,并成功吸引了众多国外客户的关注。通过与国外知名企业的合作,Antiference的产品逐渐打入国际市场,品牌知名度也大幅提升。

ADATA公司的发展小趣事

面对日益激烈的市场竞争,Antiference公司深知单打独斗难以取得长久发展。因此,公司积极寻求与其他企业和研究机构的合作,共同推动电磁干扰抑制技术的创新与发展。通过合作创新,Antiference不仅提升了自身的技术实力和市场竞争力,还推动了整个行业的进步和发展。


这些故事基于电子行业的一般情况和趋势构建,旨在展示一个虚构的公司在发展过程中可能遇到的挑战和机遇。每个故事都围绕Antiference公司的不同发展阶段和关键事件展开,旨在呈现一个全面而真实的发展画卷。

DURATOOL公司的发展小趣事

DURATOOL公司自成立以来,一直致力于电子工具的技术创新。在20世纪90年代,公司研发出了一款具有革命性的数字万用表,该产品在精确度、稳定性和操作便捷性方面均大幅超越当时的市场主流产品。这一创新不仅为DURATOOL公司赢得了大量忠实用户,也为其在电子测量工具市场树立了技术领先的形象。随后,DURATOOL公司不断加大研发投入,推出了一系列具有竞争力的新产品,逐步巩固了其在电子工具行业的领先地位。

GigPeak公司的发展小趣事

GigPeak公司自成立之初,便专注于高速数据传输技术的研发。在2005年,公司研发团队成功开发出一种新型的光电转换器,该转换器能够在极低的功耗下实现前所未有的数据传输速率。这一技术创新迅速吸引了业界的关注,并成功应用于多个高端数据中心项目,帮助GigPeak在竞争激烈的市场中脱颖而出。随着技术的不断迭代和市场的广泛认可,GigPeak逐渐成为了高速数据传输领域的领军企业。

EOZ Secme公司的发展小趣事

随着国内市场的饱和,EOZ Secme开始积极寻求海外市场的拓展。公司制定了详细的国际化战略,通过参加国际展会、建立海外销售渠道等方式,逐步打开了国际市场的大门。同时,EOZ Secme还积极与国际知名企业开展合作,共同研发新产品,拓展业务领域。这些努力使得EOZ Secme在国际市场上的影响力不断增强。

General Industrial Controls ( GIC )公司的发展小趣事
具有完善的保护电路,包括电流限制和热关断电路。

问答坊 | AI 解惑

开关电源基于补偿原理的无源共模干扰抑制技术

开关电源基于补偿原理的无源共模干扰抑制技术   摘要:介绍了一种基于补偿原理的共模干扰抑制技术,通过抑制电源辐射来减少变换器的共模干扰。这种方法被推广应用于多种功率变换器拓扑,理论和实验结果都表明该技术有效减少了电路的共模 ...…

查看全部问答>

为何数字工程师不相信EMC

我最近参加了IEEE电磁兼容性(EMC)学会的一个本地(西雅图)会议,这并不是我所居住的地方,但我极力向你推荐,在这里你可以了解更多的EMC的基本知识,还可以获取大量的免费建议。 听完Bill Ritenour关于汽油泵的静电屏蔽的演讲之后,我们开始 ...…

查看全部问答>

Verilog的程式实现

我想请教各位大大 我正在写一个关于时间和频率最大相似估测的程式 他里面有个方块图是这样的 ρ/2 〖|.|〗^2 我知道ρ的运算过程是这样的... ρ= (E{〖|s(k)|〗^2})/(E{|〖s(k)〗^2 | }+E{|〖w(k)〗^2 |})=(σ_s^2)/(σ_s^2+σ_w^2 )=SNR/(SNR ...…

查看全部问答>

神啊,救救我啊,还是红外接收的

上午去买了几个新的红外接收管 回来写了个小程序测试,接收管接收到红外信号就会输出一个低信号,然后MCU就控制一个红灯亮一下 开始我用电视遥控器试发现红灯亮的和我按的不一致,不是我按了它不亮就是我没按它却亮了, 后来发现原来我只要用手一 ...…

查看全部问答>

异步FIFO 问题

FIFO 异步用在什么地方?用SPI 和uart不可能用异步, 因为SPI 有一个同步的时钟、而uart 有固定的波特率。对吗?…

查看全部问答>

请高手捉虫!

library IEEE ;use IEEE.std_logic_1164.all ;use IEEE.std_logic_unsigned.all ;use IEEE.numeric_std.all ;entity key1 isport ( Clk_I   : in std_logic ;        Rst_I   : in std_logic ;& ...…

查看全部问答>

[求助]MSP430F247程序丢失的问题。

使用MSP430F247做项目。在生产过成中,发现有些机器反复拔插电源后,系统没反应。用仿真器读出MSP430F247的程序,发现0X8000-0X81FF的程序全部被清成0XFF。反应给FAE,他们说可能是复位时序不对进入了BSL。可是之前的产品都没有发现这个问题。 另 ...…

查看全部问答>

关于dma的

有没有人用em-stm3210e这款开发板的?貌似公司提供的DMA例程有问题 连一些基本的显示都没有有没有人知道怎么改? …

查看全部问答>

MC9S08QE32 SCI 通信

大家好!     我们用MC9S08QE32发现串口数据紊乱,但是用MC9S08QE128发现程序正常,请问大家是什么原因? 下面是我们的测试代码:   unsigned char *string1=\"  Welcome \\r\\n\";   MCU_Init();  ...…

查看全部问答>

关于安装synplifydsp3.6的问题

前不久下载一个synplifydsp3.6 也有破解文件,但是发现安装之后总是提示注册文件非法。我安装的时候时间也调整了,就是不行。…

查看全部问答>