历史上的今天

今天是:2024年10月17日(星期四)

正在发生

2019年10月17日 | STM32的SPI1、SPI2、SPI3初始化及RF1101的应用(标准库与HAL库)

发布者:MindfulCreator 来源: eefocus关键字:STM32  初始化  RF1101  标准库  HAL库 手机看文章 扫描二维码
随时随地手机看文章

——基于STM32F103RCT6


---- 标准库:

说明:相关文件共有两个:bsp_spi_cc1101.h;bsp_spi_cc1101.c;以SPI2为例。

1、“bsp_spi_cc1101.h”中的参数定义:


#ifndef _BSP_SPI_1101_H_

#define _BSP_SPI_1101_H_


#include

#include "stm32f10x.h"

#include "misc.h"

#include "os_cfg_app.h"

#include "os.h"

#include "core_cm3.h"

#include "bsp.h" 

#include "stm32f10x_spi.h"


#define CSN_CC1101_GPIO GPIOB

#define CSN_CC1101_GPIO_PIN GPIO_Pin_12


#define SPI_CC1101_GPIO GPIOB

#define SCK_CC1101_GPIO_PIN GPIO_Pin_13

#define MISO_CC1101_GPIO_PIN GPIO_Pin_14

#define MOSI_CC1101_GPIO_PIN GPIO_Pin_15


#define GDO0_CC1101_GPIO GPIOA

#define GDO0_CC1101_GPIO_PIN GPIO_Pin_11

#define SPI_GPIO_RCC_1 RCC_APB2Periph_GPIOB

#define SPI_GPIO_RCC_2 RCC_APB2Periph_GPIOA


#define CC1101_SPI SPI2


#define CSN_SET GPIO_SetBits(GPIOB,GPIO_Pin_12)

#define CSN_RESET GPIO_ResetBits(GPIOB,GPIO_Pin_12)


void SPI_CC1101_Init(void);

u8 SPI2_ReadWriteByte(u8 TxData);

#endif


2、“bsp_spi_cc1101.c”中的引脚及SPI功能初始化:


#include "bsp_spi_cc1101.h"


void SPI_CC1101_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

SPI_InitTypeDef SPI_InitStructure;

RCC_APB2PeriphClockCmd(SPI_GPIO_RCC_1 | SPI_GPIO_RCC_2,ENABLE); //初始化GPIO时钟 

/*********SPI1初始化内容****

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE); //初始化SPI1时钟

******SPI1初始化内容******/

 

/*********SPI2初始化内容************/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);    //初始化SPI2时钟

         

/********SPI3需要初始化的内容********

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);    //初始化SPI3时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //初始化复用IO时钟,重定向IO口

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //由于SPI3占用JTAG口,所以需要关闭JTAG

******SPI3需要初始化的内容*******/

//片选设定成通用IO模式

GPIO_InitStructure.GPIO_Pin=CSN_CC1101_GPIO_PIN;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;          

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;           

GPIO_Init(CSN_CC1101_GPIO,&GPIO_InitStructure);


//SCK时钟IO初始化

GPIO_InitStructure.GPIO_Pin=SCK_CC1101_GPIO_PIN;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;             

GPIO_Init(SPI_CC1101_GPIO,&GPIO_InitStructure);

//MISO的IO初始化

GPIO_InitStructure.GPIO_Pin=MISO_CC1101_GPIO_PIN;          

GPIO_Init(SPI_CC1101_GPIO,&GPIO_InitStructure);

//MOSI的IO初始化

GPIO_InitStructure.GPIO_Pin=MOSI_CC1101_GPIO_PIN;         

GPIO_Init(SPI_CC1101_GPIO,&GPIO_InitStructure);

//RF1101中用到的GDO0的IO初始化

GPIO_InitStructure.GPIO_Pin=GDO0_CC1101_GPIO_PIN;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;          

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;             

GPIO_Init(GDO0_CC1101_GPIO,&GPIO_InitStructure);

//SPI模式设置

SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;    //全双工模式

SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //主设备模式

SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b; //8字节数据通信

SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟空闲时为低电平

SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //时钟奇数边沿采样

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件控制NSS(CSN)位

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //通信速率设定,波特率预分频值

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB开始

SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC计算多项式

SPI_Init(CC1101_SPI, &SPI2_InitStructure); //初始化

    SPI_Cmd(CC1101_SPI, ENABLE); //使能

    SPI2_ReadWriteByte(0xFF);                            //RF1101启动传输

}


u8 SPI2_ReadWriteByte(u8 TxData)

{

u8 Rxdata;

uint32_t SPITimeout =0x1000;

while (SPI_I2S_GetFlagStatus(CC1101_SPI , SPI_I2S_FLAG_TXE) == RESET) //检测发送缓存区是否为空

{

if((SPITimeout--) == 0) 

return 0;

  }

SPI_I2S_SendData(CC1101_SPI,TxData); //发送一个字节

 

while (SPI_I2S_GetFlagStatus(CC1101_SPI , SPI_I2S_FLAG_RXNE) == RESET) //检测接收缓存区是否为空

  {

  if((SPITimeout--) == 0) return 0;

  }

Rxdata = SPI_I2S_ReceiveData(CC1101_SPI); //存储一个字节

  return Rxdata;             

}


---- HAL库:

以SPI1为例:


SPI_HandleTypeDef SPI1_Handler;  


void SPI1_Init(void)

{

    GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_GPIOA_CLK_ENABLE();      //使能GPIOA时钟

    __HAL_RCC_SPI1_CLK_ENABLE();        //使能SPI1时钟

    

    //NSS配置成通用IO口

    GPIO_Initure.Pin=GPIO_PIN_4;

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;         

    GPIO_Initure.Pull=GPIO_PULLUP;                 

    GPIO_Initure.Speed=GPIO_SPEED_HIGH;                       

    HAL_GPIO_Init(GPIOA,&GPIO_Initure);


//SPI引脚初始化

    GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;

    GPIO_Initure.Mode=GPIO_MODE_AF_PP;             

    GPIO_Initure.Pull=GPIO_PULLUP;                 

    GPIO_Initure.Speed=GPIO_SPEED_HIGH;                        

    HAL_GPIO_Init(GPIOA,&GPIO_Initure);

//SPI功能配置

    SPI1_Handler.Instance=SPI1;                          //SPI1

    SPI1_Handler.Init.Mode=SPI_MODE_MASTER;            //主模式

    SPI1_Handler.Init.Direction=SPI_DIRECTION_2LINES;    //双线模式

    SPI1_Handler.Init.DataSize=SPI_DATASIZE_8BIT;        //发送接收8位帧结构

    SPI1_Handler.Init.CLKPolarity=SPI_POLARITY_LOW;    //时钟的空闲状态为高电平

    SPI1_Handler.Init.CLKPhase=SPI_PHASE_1EDGE;          //串行同步时钟的第二个跳变沿(上升或下降)数据被采样

    SPI1_Handler.Init.NSS=SPI_NSS_SOFT;                  //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制

    SPI1_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256; //定义波特率预分频的值:波特率预分频值为256

    SPI1_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始

    SPI1_Handler.Init.TIMode=SPI_TIMODE_DISABLE;        //关闭TI模式

    SPI1_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE; //关闭硬件CRC校验

    SPI1_Handler.Init.CRCPolynomial=7;                  //CRC值计算的多项式

    HAL_SPI_Init(&SPI1_Handler); //初始化

    

    __HAL_SPI_ENABLE(&SPI1_Handler);                    //使能SPI1

    SPI1_ReadWriteByte(0xFF);                            //RF1101启动传输

}


//SPI底层驱动,时钟使能,引脚配置

//此函数会被HAL_SPI_Init()调用

//hspi:SPI句柄

void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)

{

    GPIO_InitTypeDef GPIO_Initure;

    

    __HAL_RCC_GPIOA_CLK_ENABLE();       //使能GPIOA时钟

    __HAL_RCC_SPI1_CLK_ENABLE();        //使能SPI1时钟

    

    //PB13,14,15

    GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;

    GPIO_Initure.Mode=GPIO_MODE_AF_PP;           

    GPIO_Initure.Pull=GPIO_PULLUP;                 

    GPIO_Initure.Speed=GPIO_SPEED_HIGH;                     

    HAL_GPIO_Init(GPIOA,&GPIO_Initure);

}

void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)

{

    assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler)); //判断有效性

    __HAL_SPI_DISABLE(&SPI1_Handler);            //关闭SPI

    SPI1_Handler.Instance->CR1&=0XFFC7;          //位3~5清零,用来设置波特率

    SPI1_Handler.Instance->CR1|=SPI_BaudRatePrescaler; //设置SPI速度

    __HAL_SPI_ENABLE(&SPI1_Handler);              //使能SPI

}


u8 SPI1_ReadWriteByte(u8 TxData)

{

u8 Rxdata;

HAL_SPI_TransmitReceive(&SPI1_Handler,&TxData,&Rxdata,1, 1000);       

  return Rxdata;              

}


注:与HAL库有一定的区别;重点注意SPI3与其他两个的区别;务必要检测缓存区是否为空。

关键字:STM32  初始化  RF1101  标准库  HAL库 引用地址:STM32的SPI1、SPI2、SPI3初始化及RF1101的应用(标准库与HAL库)

上一篇:STM32F42XX SPI3无输出问题
下一篇:stm32F411 SPI3 无输出

推荐阅读

全球知名国际机场——迪拜国际机场计划在敏感区域设置基于激光雷达的安防方案,经过测试多家世界顶级激光雷达公司所提供的机械式激光雷达和固态激光雷达,最终镭神智能的CX系列16线混合固态激光雷达以长达三个多月24小时不间断作业的优异的可靠性表现强势胜出,有效解决了机场敏感区域安保监测的高精度与高稳定性要求,获得机场百般青睐与赞赏,让中国制造...
国现有近四分之一的家庭拥有智能音箱,尽管许多用户担心安全问题,但绝大多数用户都对他们的设备表示满意。 Strategy Analytics 对 1000 多个智能音箱用户进行的一项新调查发现,五分之三的用户担心语音控制设备会在未经他们同意的情况下录音,而近一半的人不会通过其智能音箱共享付款信息。但是,有 88%的用户对他们的智能音箱感到满意,四分之三的...
10月14日消息,此前有消息称,华为与神州数码,以及其他竞购方TCL、小米进行洽谈,部分出售旗下荣耀智能手机业务。TCL内部人士就此事对新浪数码回应称,暂时对此事不予置评。  据知情人士称,华为技术公司正与神州数码及其他公司洽谈,以出售荣耀品牌的部分资产,交易价格可能达到250亿元。消息还指出,作为荣耀手机的主要经销商,神州数码...
博主@数码闲聊站爆料,明年是联发科冲击高端市场的关键一年,联发科下一代旗舰芯片将是前期唯一一款基于台积电4nm工艺打造的产品。此前披露的信息显示,联发科下一代旗舰Soc可能会命名为天玑2000。据爆料,天玑2000将采用超大核+大核+小核的三丛核架构,其中超大核为Cortex X2,与目前的Cortex-X1相比,Cortex-X2在指令集升级为ARMv9-A的同时,还针对分支...

史海拾趣

问答坊 | AI 解惑

工控机与PLC、普通电脑的区别

工控机与PLC的区别并不在于长得什么样子,也不在于使用的工作环境,而在于它们的功能。它就发展来说,它们来自不同的途径,PLC来源以继电器为特征的电气逻辑控制,工控机来源于计算机。早期PLC只能用于进行逻辑运算,现在功能越来越强大了,但总体 ...…

查看全部问答∨

ucos任务调用有问题

我在写基于ucosII任务时,出现这样一个问题。程序如下。这样调用时为什么最终结果LED1,LED2,LED3一直亮任务没有实现抢占调用,但是若把任一个任务注释掉例如//OSTaskCreate (TaskLED1,(void *)0, &TaskLED1Stk[TaskLED1StkSize - 1], 3);可以实 ...…

查看全部问答∨

函数信号发生器的问题

  要做一个函数信号发生器 用凌阳061a 和max038 max038的fadj口调节频率-2.4v到2.4v可调 用061的dac口输出的是0-3mA电流 怎样转换成2.4v到2.4v可调电压 谢谢啦 并诚交电路设计能人异士为好友 如果可能诚心拜师 非诚勿扰 联系邮箱lian.sun ...…

查看全部问答∨

WINCE数据库的问题,谁做过帮忙看一下,谢谢

http://community.eeworld.net/Expert/topic/5500/5500169.xml?temp=.9371149 CeSeekDatabase(g_hDB, CEDB_SEEK_VALUEFIRSTEQUAL,(DWORD)&prop,&dwIndex);总返回0,错误码:参数不正确.为什么? 附代码: CEPROPVAL prop ; prop.propid = PID_N ...…

查看全部问答∨

关于MP3软解码

ti的i2s_demo例程可以播放wav的,我想弄得也能播mp3,弄得播放声音有杂音,而且节奏有点快。谁弄过这个,交流下。…

查看全部问答∨

新手SEO从这里开始

      (一)、关键词密度、布局     关键词布局是当中至关重要的一点,良好的关键词密度和布局是排名敏捷晋升的一个关键,然而怎么的布局更利于搜索?     1、 首先我们看看关键词密度   我以为密度至少也要在3% ...…

查看全部问答∨

有方模块开关机操作指引

深圳市有方科技GSM/GPRS/3G模块深圳市有方科技M2M团队向业内推出 全球第一款纯数据的GPRS工业级模块 特点: 1,体积小 2,功耗低 3,工作温度低   ============================================================================    ...…

查看全部问答∨

收到奖品了!,同时也了解了TDK!

铁氧体的发明确实改变了很多领域的发展!…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved