历史上的今天
返回首页

历史上的今天

今天是:2024年09月22日(星期日)

正在发生

2018年09月22日 | STM32标准库SPI的初始化

2018-09-22 来源:eefocus

SPI的初始化比较简单,但是能明白原理是最好的,毕竟出了问题以后好排除。

SPI的初始化过程:

1、初始化GPIO

2、初始化SPI_InitStructure结构体

3、使能SPI外设

SPI的初始化结构体如下图所示:

typedef struct

{

  uint16_t SPI_Direction;          

  uint16_t SPI_Mode;                

  uint16_t SPI_Daize;            

  uint16_t SPI_CPOL;                

  uint16_t SPI_A;                

  uint16_t SPI_NSS;                

 

  uint16_t SPI_BaudRatePrescaler;  

  uint16_t SPI_FirstBit;            

  uint16_t SPI_CRCPolynomial;      

}SPI_InitTypeDef;

SPI_Direction为SPI的传输方向有如下选项:

#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000)     //2线全双工

#define SPI_Direction_2Lines_RxOnly     ((uint16_t)0x0400)      //2线只接收

#define SPI_Direction_1Line_Rx          ((uint16_t)0x8000)          //1线只接收

#define SPI_Direction_1Line_Tx          ((uint16_t)0xC000)          //1线只发送

#define IS_SPI_DIRECTION_MODE(MODE) (((MODE) == SPI_Direction_2Lines_FullDuplex) || \

                                     ((MODE) == SPI_Direction_2Lines_RxOnly) || \

                                     ((MODE) == SPI_Direction_1Line_Rx) || \

                                     ((MODE) == SPI_Direction_1Line_Tx))

SPI_Mode指定SPI的模式的可选择参数如下:

SPI主机模式下,主机输出SCK,从机时候接收SCK,当配置为主机模式接收数据的时候必须发送数据来启动SCK


#define SPI_Mode_ter                 ((uint16_t)0x0104)                       //主机模式

#define SPI_Mode_Slave                  ((uint16_t)0x0000)                        //从机模式

#define IS_SPI_MODE(MODE) (((MODE) == SPI_Mode_ter) || \

                           ((MODE) == SPI_Mode_Slave))

SPI_Daize为一帧数据的长度,可选参数为:


#define SPI_Daize_16b                ((uint16_t)0x0800)       //8位

#define SPI_Daize_8b                 ((uint16_t)0x0000)         //16位

#define IS_SPI_DAIZE(DAIZE) (((DAIZE) == SPI_Daize_16b) || \

                                   ((DAIZE) == SPI_Daize_8b))

一般选择为8位

SPI_CPOL和SPI_A是比较重要的参数,他们决定了触发信号和采样信号的时刻,

SPI_CPOL=0,SCK空闲状态为低电平

SPI_CPOL=1,SCK空闲状态为高电平

SPI_A=0,表示在第一个边沿跳变时采样

SPI_A=1,表示在第二个边沿跳变时采样

当SPI_CPOL=0,SPI_A=0时,SCK空闲状态为低电平,表示在第一个边沿跳变时采样,说明采样状态为上升沿采样,下降沿触发,

当SPI_CPOL=1,SPI_A=0时,SCK空闲状态为高电平,表示在第一个边沿跳变时采样,说明采样状态为下降沿采样,上升沿触发。

当SPI_CPOL=0,SPI_A=1时,SCK空闲状态为高电平,表示在第二个边沿跳变时采样,说明采样状态为下降沿,上升沿触发

当SPI_CPOL=1,SPI_A=1时,SCK空闲状态为高电平,表示在第二个边沿跳变时采样,说明采样状态为上升沿降沿,下降沿触发

特别提醒:这两个位必须和外设支持的传输方式一致

SPI_CPOL的可选择参数如下:

#define SPI_CPOL_Low                    ((uint16_t)0x0000)

#define SPI_CPOL_High                   ((uint16_t)0x0002)

#define IS_SPI_CPOL(CPOL) (((CPOL) == SPI_CPOL_Low) || \

                           ((CPOL) == SPI_CPOL_High))

SPI_A的可选择参数如下:

#define SPI_A_1Edge                  ((uint16_t)0x0000)

#define SPI_A_2Edge                  ((uint16_t)0x0001)

#define IS_SPI_A(A) (((A) == SPI_A_1Edge) || \

                           ((A) == SPI_A_2Edge))

SPI_NSS为CS信号线,该位表示CS信号是由软件模拟还是由硬件自动产生。官方推荐CS信号由软件模拟,毕竟CS信号比较简单。可选择的参数如下:

#define SPI_NSS_Soft                    ((uint16_t)0x0200)

#define SPI_NSS_Hard                    ((uint16_t)0x0000)

#define IS_SPI_NSS(NSS) (((NSS) == SPI_NSS_Soft) || \

                         ((NSS) == SPI_NSS_Hard))

/**

SPI_BaudRatePrescaler SPI的分频系数设置,可选参数如下

#define SPI_BaudRatePrescaler_2         ((uint16_t)0x0000)

#define SPI_BaudRatePrescaler_4         ((uint16_t)0x0008)

#define SPI_BaudRatePrescaler_8         ((uint16_t)0x0010)

#define SPI_BaudRatePrescaler_16        ((uint16_t)0x0018)

#define SPI_BaudRatePrescaler_32        ((uint16_t)0x0020)

#define SPI_BaudRatePrescaler_64        ((uint16_t)0x0028)

#define SPI_BaudRatePrescaler_128       ((uint16_t)0x0030)

#define SPI_BaudRatePrescaler_256       ((uint16_t)0x0038)

#define IS_SPI_BAUDRATE_PRESCALER(PRESCALER) (((PRESCALER) == SPI_BaudRatePrescaler_2) || \

                                              ((PRESCALER) == SPI_BaudRatePrescaler_4) || \

                                              ((PRESCALER) == SPI_BaudRatePrescaler_8) || \

                                              ((PRESCALER) == SPI_BaudRatePrescaler_16) || \

                                              ((PRESCALER) == SPI_BaudRatePrescaler_32) || \

                                              ((PRESCALER) == SPI_BaudRatePrescaler_64) || \

                                              ((PRESCALER) == SPI_BaudRatePrescaler_128) || \

                                              ((PRESCALER) == SPI_BaudRatePrescaler_256))

具体SPI的时钟可根据时钟树来设置。

SPI_FirstBit 表示先发送高位还是先发送低位

#define SPI_FirstBit_MSB                ((uint16_t)0x0000)

#define SPI_FirstBit_LSB                ((uint16_t)0x0080)

#define IS_SPI_FIRST_BIT(BIT) (((BIT) == SPI_FirstBit_MSB) || \

                               ((BIT) == SPI_FirstBit_LSB))

SPI_CRCPolynomial  为CRC值计算的多项式,参数可设置为任意数字

下面为SPI的初始化实例:

void SPI2_Init(void)

{

       GPIO_InitTypeDef GPIO_InitStructure;

       SPI_InitTypeDef  SPI_InitStructure;

RCC_APB2PerClockCmd( RCC_APB2Per_GPIOB, ENABLE );

RCC_APB1PerClockCmd( RCC_APB1Per_SPI2,  ENABLE );

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15ÉÏÀ­

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  

SPI_InitStructure.SPI_Mode = SPI_Mode_ter;

SPI_InitStructure.SPI_Daize = SPI_Daize_8b;

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

SPI_InitStructure.SPI_A = SPI_A_2Edge;

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

SPI_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPI2, &SPI_InitStructure);  

 

SPI_Cmd(SPI2, ENABLE); 

SPI2_ReadWriteByte(0xff);

}


推荐阅读

史海拾趣

Capital Advanced Technologies公司的发展小趣事

Capital Advanced Technologies(简称CAT)的创立,源于创始人对电子行业未来发展的深刻洞察。在电子科技迅猛发展的背景下,CAT应运而生,致力于为客户提供先进的电子技术和解决方案。公司初期,CAT便以高标准的研发实力和生产技术,迅速在市场中占据了一席之地。其独特的电路设计、精确的生产工艺和严格的品质控制,使得CAT的产品在市场上获得了良好的口碑。

Gravitech公司的发展小趣事

Capital Advanced Technologies(简称CAT)的创立,源于创始人对电子行业未来发展的深刻洞察。在电子科技迅猛发展的背景下,CAT应运而生,致力于为客户提供先进的电子技术和解决方案。公司初期,CAT便以高标准的研发实力和生产技术,迅速在市场中占据了一席之地。其独特的电路设计、精确的生产工艺和严格的品质控制,使得CAT的产品在市场上获得了良好的口碑。

DUCATI公司的发展小趣事

随着产品技术的不断升级和完善,CAT开始积极寻求市场拓展的机会。公司不仅在国内市场取得了显著的成绩,还逐步打开了国际市场的大门。CAT的产品远销海外,赢得了全球客户的信赖和好评。同时,公司还注重品牌塑造,通过参加国际电子展会、举办技术研讨会等方式,不断提升品牌知名度和影响力。

Hamlin ( Littelfuse )公司的发展小趣事

面对未来电子行业的发展趋势和市场变化,CAT制定了明确的发展战略和布局。公司将继续加大研发投入,推动技术创新和产业升级;同时,积极拓展新的应用领域和市场空间,寻求与更多合作伙伴的共赢发展。此外,CAT还将注重人才培养和团队建设,为公司的长远发展提供坚实的人才保障。

通过以上五个故事,我们可以看到Capital Advanced Technologies公司在电子行业里发展起来的艰辛与辉煌。他们凭借技术创新、市场拓展、品质管理和战略布局等方面的不断努力,逐渐成为了电子行业的领军企业。

DESIGNERSYSTEMS公司的发展小趣事

DESIGNERSYSTEMS公司非常注重人才的培养和引进。他们建立了一套完善的人才培养机制,通过内部培训、外部交流等多种方式不断提升员工的综合素质和专业能力。同时,DESIGNERSYSTEMS还积极引进国内外优秀人才,为公司的发展注入新的活力和创新力。这种对人才的重视和投入使得DESIGNERSYSTEMS在电子行业中保持了持续的创新力和竞争力。

千志电子(CCO)公司的发展小趣事

为了进一步拓展业务版图,千志电子开始进军国际市场。2006年,千志电子在香港设立了千志电子(香港)有限公司,将其作为国际服务据点重心之一。这一举措使千志电子能够更好地了解国际市场需求和趋势,加强与国外客户的联系和合作。同时,千志电子还积极参加国际展览和论坛,展示其优质产品和先进技术,提高了品牌知名度和国际影响力。

问答坊 | AI 解惑

wince 如何读取Excel文件?

     wince里面根据Excel里的行和列 读取Excel文件的内容?有没有这方面的代码,请大虾们帮帮忙,谢谢了!!      不是打开Excel 是读里面的数值。…

查看全部问答>

招聘 北京

1.WinCE/Windows Mobile 应用研发工程师(2人) 职位要求 1、精通WinCE/Windows Mobile 下 C/C++嵌入式应用程序开发,有2年以上相关研发经验; 2、精通EVC,VS 2005等开发工具; 3、精通MFC,Win32用户界面相关类,API,熟悉TCP/IP, HTTP等 ...…

查看全部问答>

evc通讯久了定时器运行越来越慢,怎么回事?

在WINCE系统中,我的定时器2秒一次,期间有读串口线程,刚开始定时器运行正常,几个小时候就运行的越来越慢,并没有死机,请问是什么原因?…

查看全部问答>

对于这个图,该设置为推挽、还是开漏输出?

下载 (23.02 KB) 2010-5-22 21:57 图1:STM32F10X的IO端口 下载 (10.51 KB) 2010-5-22 21:57 图2:一个实际连接 请问:对于SO, SI, SCK, CS,GPIO端口该设置为哪种模式?…

查看全部问答>

请各位大牛指点一下,谢谢。

本帖最后由 dontium 于 2015-1-23 13:24 编辑 系统结构是这样:AD->FIFO->(SDRAM)->DSP。这里打个括号是指FIFO和SDRAM采用PDT连接方式与DSP的EMIFA连接。AD采样后把数据输入FIFO,FIFO半满后通过PDT直接送入SDRAM,然后DSP从SDRAM取数据处理 ...…

查看全部问答>

挺MSP430

接触430单片机约3年了,一直在用,用过1xx,2xx,5xx,只是4xx的没有接触过感觉有些遗憾。 430的性能,作为16位机,秒杀了基本所有常见8位机,只是价格略显偏高。 430的时钟系统最为完美,专为低功耗设计啊,唤醒特别快。  …

查看全部问答>

哪位前辈用MSP430做过绝对式光电编码器的测试?

哪位前辈用MSP430做过绝对式光电编码器的测试?现在做题目,急求各位前辈提供程序。。。非常感谢,感动流涕。…

查看全部问答>

block ram可以实现移位操作吗

我想在一个周期内,把地址16-31内的数据移到地址0-15内,能实现吗? [ 本帖最后由 超自然 于 2012-10-17 11:07 编辑 ]…

查看全部问答>

TEA2025低成本高保真音响

如图,谁有兴趣,做个PCB板子也行,以前我在面包板上搭建测试的,然后直接把一堆零件的管脚立体的焊接好了,效果还特别好,板子都省了。…

查看全部问答>