news 2026/5/26 2:10:56

STM32-SPI数据发送/接收代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32-SPI数据发送/接收代码

#include "stm32f10x.h"

void App_SPI1_Init(void);//APP表示应用层代码,也就是用户自己写的
void APP_SPI_MasterTransmitReceive(SPI_TypeDef *SPIx, const uint8_t *pDataTx, uint8_t *pDataRx, uint16_t Size);

int main(void)
{
void App_SPI1_Init();
while(1)
{
}
}

void App_SPI1_Init(void){
//#1.初始化IO引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SPI1, ENABLE);

GPIO_InitTypeDef GPIO_InitStruct;

//PB3 SCK AF_PP 2MHz
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_Init(GPIOB, &GPIO_InitStruct);

//PB4 MOSI IPU
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOB, &GPIO_InitStruct);

//PB5 MISO AF_PP 2MHz
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_Init(GPIOB, &GPIO_InitStruct);

//PA15 普通IO Out_PP 2MHz
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_Init(GPIOA, &GPIO_InitStruct);

//#2.对SPI本身进行初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

SPI_InitTypeDef SPI_InitStruct;
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;

SPI_Init(SPI1, &SPI_InitStruct);

SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);//向NSS引脚输入1,接到高电压防止主机被当作从机
}

void APP_SPI_MasterTransmitReceive(SPI_TypeDef *SPIx, const uint8_t *pDataTx, uint8_t *pDataRx, uint16_t Size){

//#1.闭合总开关
SPI_Cmd(SPIx, ENABLE);

//#2.发送第一个字节
SPI_I2S_SendData(SPIx, pDataTx[0]);//若不发第一个字节,RDR中无数据可读,也无法开始接收数据。

//#3.循环Size-1次
for(uint8_t i=0; i<Size-1; i++){
//发送字节(先等待TxE,再循环,直至发到第i+1个字节)
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)== RESET);
SPI_I2S_SendData(SPIx, pDataTx[i+1]);

//接收字节(先等待RxNE,再循环,直至接收到第i个字节)
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)== RESET);
pDataRx[i] = SPI_I2S_ReceiveData(SPIx);
}

//#4.接收最后一个字节(第Size-1个)
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)== RESET);
pDataRx[Size-1] = SPI_I2S_ReceiveData(SPIx);

//#5.断开总开关
SPI_Cmd(SPIx,DISABLE);
}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 7:55:20

Dify 工作原理与应用实例

Dify.AI 是一款开源的 LLM&#xff08;大语言模型&#xff09;应用开发平台。它融合了后端即服务&#xff08;Backend as a Service, BaaS&#xff09;和 LLMOps 的理念&#xff0c;允许开发者&#xff08;甚至非技术人员&#xff09;通过可视化界面快速构建生成式 AI 应用。 本…

作者头像 李华
网站建设 2026/5/25 17:42:03

VRM与VRChat模型互转终极指南:免费工具让新手快速上手

VRM与VRChat模型互转终极指南&#xff1a;免费工具让新手快速上手 【免费下载链接】VRMConverterForVRChat 项目地址: https://gitcode.com/gh_mirrors/vr/VRMConverterForVRChat 还在为VRM模型无法在VRChat中使用而烦恼吗&#xff1f;现在&#xff0c;一款强大的免费转…

作者头像 李华
网站建设 2026/5/25 18:19:44

Inventor 二次开发从入门到精通(1)

Autodesk Inventor 是一款面向机械设计的三维参数化建模软件&#xff0c;其开放的 API 体系为二次开发提供了强大的支撑。本教程围绕 Inventor 的 **.NET API&#xff08;C# 为主&#xff09;** 展开&#xff0c;兼顾 VBA、iLogic 等开发方式&#xff0c;从开发环境搭建到高级实…

作者头像 李华
网站建设 2026/5/26 4:58:40

Inventor 二次开发从入门到精通(4)

4.1 Application 对象&#xff1a;Inventor 的入口 Application对象是 Inventor API 的根对象&#xff0c;所有操作都从这里开始。其核心功能包括&#xff1a; 管理文档&#xff08;创建、打开、保存、关闭&#xff09;&#xff1b;访问用户界面&#xff08;功能区、命令、对…

作者头像 李华
网站建设 2026/5/25 23:24:37

6款必知的reMarkable GUI客户端:本地管理VS云同步全解析

6款必知的reMarkable GUI客户端&#xff1a;本地管理VS云同步全解析 【免费下载链接】awesome-reMarkable A curated list of projects related to the reMarkable tablet 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-reMarkable 还在为reMarkable平板文件传输…

作者头像 李华