1 概述
基本的部分前文《STM32-SPI》已经介绍过了,这里只记怎么用。
1.1 引脚映射
STM32F103ZET6的三个SPI的引脚分别为
SPI1_SCK PA5(21)
SPI1_MISO PA6 (22)
SPI1_MOSI PA7 (23)
SPI1_NSS PA4(20)
SPI2_SCK PB13(34)
SPI2_MISO PB14(35)
SPI2_MOSI PB15(36)
SPI2_NSS PB12(33)
SPI3_SCK PB3(55)
SPI3_MISO PB4(56)
SPI3_MOSI PB5(57)
SPI3_NSS PA15(50)
1.2 时钟源
SPI1在APB1时钟下,SPI2和SPI3在APB2时钟下。
2 常用库函数
void SPI_I2S_DeInit(SPI_TypeDef* SPIx);
void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);
void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct);
void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct);
void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct);
void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState);
void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState);
void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState);
void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState);
void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);
void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft);
void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState);
void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize);
void SPI_TransmitCRC(SPI_TypeDef* SPIx);
void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState);
uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC);
uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx);
void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction);
FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);
void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);
ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT);
void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT);
注意:hal库函数有个容易犯错的地方。
F4可以设置一次传输最小单位为一个字节或两个字节。但是发送函数接收的缓存参数都是指向u8类型的指针,但是函数参数Size表示的并不是字节数,而是“amount of data to be sent”,要发送的最小单位的数量。比如,每帧4个字节,设置SPI databits 为16位,那么调用HAL_SPI_Transmit函数时,Size=2。
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
3 代码范例
void SPI2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能
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上拉
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI2, ENABLE); //使能SPI外设
SPI2_ReadWriteByte(0xff);//启动传输
}
上一篇:【MCP3208/MCP3204】STM32多通道AD采集
下一篇:STM32-SPI
推荐阅读最新更新时间:2024-11-10 22:46
推荐帖子
- vs2005同开发板连接问题
- 各位大虾们,我现在用PCM-3586(CPU:vortex86DX)的板子开发一个程序,现在遇到了一个很棘手的问题,就是开发板不能同vs2005连接进行调试程序,必须通过U盘拷到板子上面去,非常麻烦。前几天试过用一根双公口的USB线让板子同PC连起来,但失败了。我的这块板子上的是ce6.0的操作系统,板子上有一个网口,四个串口,两个普通的USB口,请问如何才能让板子与PC连接起来?最好是能通过网口与PC机相连,如网口不行也可以用其它的口。只要能够在线调试程序都行,请各位大虾们支支招啊,被这个问
- znstchhh 嵌入式系统
- 阿牛哥参加太阳能风能展和军民两用技术展览会见闻
- 9月19日下午阿牛哥赶往静安庄国展中心参观太阳能风能展和军民两用技术展览会。快到中秋节和国庆节了,但是会场里观众很多。光伏产品和风能发电是热点,有一些太阳能基板材料供应商,有很多是德国和奥地利的公司。很奇怪这次无锡尚德没有参展。阿牛哥和北京一些参展商沟通,很多是光伏并网发电系统。还有国家电网公司下属的几个媒体朋友也组织展位,看来太阳能和风能是很热的。阿牛哥在会展上有看到了目录分销商派睿电子的展台,厚厚的产品目录,还有技术支持。今年派睿电子的业务很不错,看看展台上派睿电子的朋友耐心的解答就知
- jameswangsynnex 电源技术
- 【复旦微车规MCU FM33FT0A 系列】--LVGL移植
- 开发板MCU型号FM33FT056A,CodeFlash384KB,RAM32KB,移植lvglRAM略偏小,移植时要注意些裁剪。一.了解LVGL及库准备1.了解LVGLLVGL全称LightandVersatileGraphicsLibrary,轻量化和多功能的图形库,遵循MIT开源许可协议,具有以下特性(whatLVGLcandoforyou)。(1)对硬件的要求CPU:16、32、64位主频:推荐16MHzFla
- dirty 汽车电子
- TS101开发板link port与主机通信问题
- 请教各位高手,如何实现TS101开发板上linkport与主机的通信,有专用的linkport连接线缆可用吗?TS101开发板linkport与主机通信问题先自己顶一下,拜谢高手回复!!!
- loboyang DSP 与 ARM 处理器
- 转来的一个ucos在51单片机上面跑的例子
- 前言想了很久,要不要写这篇文章?最后觉得对操作系统感兴趣的人还是很多,写吧.我不一定能造出玉,但我可以抛出砖.包括我在内的很多人都对51使用操作系统呈悲观态度,因为51的片上资源太少.但对于很多要求不高的系统来说,使用操作系统可以使代码变得更直观,易于维护,所以在51上仍有操作系统的生存机会.流行的uCos,Tiny51等,其实都不适合在2051这样的片子上用,占资源较多,唯有自已动手,以不变应万变,才能让51也有操作系统可用.这篇贴子的目的,是教会大家如何现场写一个OS,而不是给大
- njlianjian 实时操作系统RTOS
- 【翌创ET6001测评】以KEY控制LED
- 为了一种GPIO口的输入功能,特为它配置了一个触摸式按键以控制LED的亮灭。其中,将GPIO2_4与开发板上的LED9相连;将GPIO2_3与触摸式按键的输出引脚相连。为对按键连接引脚的配置,相应的函数为:staticvoidKEY_Init(void){IOC_Init_TypeDefinit;IOC_ConfigStructInit(&init);init.mode=IOC_AF_MODE_3;init.dir=GPIO_DIR_IN_
- jinglixixi 国产芯片交流
设计资源 培训 开发板 精华推荐
- LT4276BHUFD 90W LTPoE++ 电源在正向模式下的典型应用电路,具有 12V、7A 输出
- AD5330 并行接口、单电压输出、8 位 DAC 的典型应用
- LT1767EMS8-5 12V 至 3.3V 降压转换器的典型应用电路
- 具有 I2C 接口的 LTC2606IDD 16 位轨至轨 DAC 的典型应用
- LTC1775CS 2.5V/5A 可调输出降压稳压器的典型应用电路
- LDK120PU32R 3.2V低压降稳压器典型应用固定电路
- EVAL-AD1937AZ,评估 AD1937 具有 PLL 192 kHz、24 位编解码器的四个 ADC/八个 DAC 的评估板
- 使用 Semtech 的 SC8863 的参考设计
- TYPEC_TTL
- 使用 ON Semiconductor 的 LA4708N 的参考设计