STM32之SPI从机例程

发布者:legend8最新更新时间:2019-03-08 来源: eefocus关键字:STM32  SPI  从机例程 手机看文章 扫描二维码
随时随地手机看文章

#include "stm32f10x.h"



/* RCC时钟配置 */

void RCC_config(void)

ErrorStatus HSEStartUpStatus;



/* RCC寄存器设置为默认配置 */

RCC_DeInit();

/* 打开外部高速时钟 */

RCC_HSEConfig(RCC_HSE_ON);

/* 等待外部高速时钟稳定 */

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS) 

/* 设置HCLK = SYSCLK */

RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* 设置PCLK2 = HCLK */

RCC_PCLK2Config(RCC_HCLK_Div1);

/* 设置PCLK1 = HCLK / 2 */

RCC_PCLK1Config(RCC_HCLK_Div2);

// /* 设置FLASH代码延时 */

// FLASH_SetLatency(FLASH_Latency_2);

// /* 使能预取址缓存 */

// FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

/* 设置PLL时钟源为HSE倍频9 72MHz */

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

/* 使能PLL */

RCC_PLLCmd(ENABLE);

/* 等待PLL稳定 */

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

/* 设置PLL为系统时钟源 */

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/* 等待系统时钟源切换到PLL */

while(RCC_GetSYSCLKSource() != 0x08);

}

}



/* GPIO配置 */

void GPIO_config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;



/* 时钟配置 */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);



/* MISO配置为复用推挽输出 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);


/* SCK和MOSI配置为浮空输入 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);


/* NSS配置为浮空输入 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}



/* SPI配置 */

void SPI_config(void)

{

SPI_InitTypeDef SPI_InitStructure;


/* 时钟配置 */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_SPI1, ENABLE); 


/* 配置SPI模式 */

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;

SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;

SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;

SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

SPI_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPI1, &SPI_InitStructure);


/* 打开接收中断 */

SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE); 


/* 打开SPI1 */

SPI_Cmd(SPI1, ENABLE);

}



/* 中断嵌套控制器配置 */

void NVIC_config(void)

{

NVIC_InitTypeDef NVIC_InitStructure;


/* 选择中断分组2 */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);



/* 设置SPI1中断 */

NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}



/* 毫秒延时函数 */

void delay_ms(uint16_t time)

{    

uint16_t i = 0;  



while(time--)

{

i = 12000;

while(i--);    

}

}



/* 主函数 */

int main(void)

/* RCC时钟配置 */

RCC_config();


/* GPIO配置 */

GPIO_config(); 



/* 中断嵌套控制器配置 */

NVIC_config();


/* SPI配置 */

SPI_config();


while(1)

{

delay_ms(1000);

}

}



void SPI1_IRQHandler(void) 

{

volatile uint8_t i;


/* 接收中断 */

if(SPI_I2S_GetITStatus(SPI1, SPI_I2S_IT_RXNE) == SET)

/* 接收到数据 */

while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

i = SPI_I2S_ReceiveData(SPI1);

while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

SPI_I2S_SendData(SPI1, i);


/* 清除接收中断 */

SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_RXNE);

}


关键字:STM32  SPI  从机例程 引用地址:STM32之SPI从机例程

上一篇:STM32之I2C原理
下一篇:STM32之SPI主机例程

推荐阅读最新更新时间:2024-03-16 16:25

【STM32+W5500】22,W5500连接外部服务器失败,如ONENET
1,W5500连接外部服务器ONENET失败,主要是IP地址错误,推荐使用IP 183.230.40.34 ,端口80 2,在ONENET官网上面,可以看到服务器的IP地址为 ONENET HTTP服务器地址域名为:jjfarfapi.heclouds.com 端口号为80, jjfarfapi.heclouds.com 183.230.40.34 3, 与平台HTTP服务器建立HTTP连接,服务器URL:api.heclouds.com 端口号:80 api.heclouds.com 183.230.40.33 4,实际使用情况是这样的, 当ONENET的服务器IP地址为183
[单片机]
【STM32+W5500】22,W5500连接外部服务器失败,如ONENET
解决STM32 不能读RAM 下载的问题
制作了两个ARM-OB下载器,原以为会很快搞定,谁知道,在最后一步出现了如下的问题: ERROR: RAM check failed @ address 0x20000000. - ERROR: Write: 0xE7FEBE00 E07CE062 - ERROR: Read: 0x0000000 000000000 - ERROR: (0 bytes of RAM have been checked successfully) - ERROR: Failed to read back target memory 我感觉好奇怪啊,三个月前我制作ARM-OB下载器的时候还没有这个问题出现,为什么呢? 百度该问
[单片机]
SPI接口的出错分析及其改进
  单片机(MCU)系统为了与SPI标准外围接口器件进行通信,必须使用SPI( Serial Peripheral Interface,串行外设接口)总线。SPI总线系统是Motorola提出的一种同步串行外设接口,有信号线少、协议简单、传输速度快的特点,因此有不少外围器件都采用SPI总线,如Flash RAM、A/ D转换器、LED显示器、MCU以及计算机网络等。MCU中的SPI接口通过配置可与各个厂家生产的多种标准外围器件直接连接。   对于那些没有SPI接口功能的MCU来说,SPI接口的功能靠软件控制MCU的I/O口的方法来模拟。不过,用软件来模拟SPI接口的功能,工作速度非常慢,并且需要主从器件的软件之间配合得非常好。
[单片机]
stm32 Flash 模拟EEPROM
/* *STM32的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等3部分组成。 * 对于大容量产品 每页2K字节 * 小容量和中容量产品则每页只有1K字节 * */ /* * *闪存的读取 *内置闪存模块可以在通用地址空间直接寻址, *任何32位数据的读操作都能访问闪存模块的内容并得到相应的数据。 *这里要特别留意一个闪存等待时间,因为CPU运行速度比FLASH快得多, *STM32F103的FLASH最快访问速度 24Mhz,如果CPU频率超过这个速度, *那么必须加入等待时间,比如我们一般使用72Mhz的主频,那么FLASH等待周期就必须设置为2, *该设置通过FLASH_ACR寄存器设置。
[单片机]
<font color='red'>stm32</font> Flash 模拟EEPROM
STM32将PA13/PA14/PA15当做普通的IO口使用
在STM32要使用JTMS(PA13)、 JTCK(PA14)作为普通I/O口的时候,要在初始化前添加如下代码(顺序不能颠倒): RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 以下两句二选一: 使用GPIO_Remap_SWJ_Disable就不能使用SWD下载功能,需要再次下载的时候只能讲BO和B1全部拉低,或者使用串口下载;使用GPIO_Remap_SWJ_JTAGDisable可以使用SWD功能 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable , ENABLE); //Full SWJ Disabled (JTAG-DP +
[单片机]
STM32定时器做外部脉冲信号计数器用
简介:今天,尝试使用STM32的计数器的外部时钟功能,来对外部脉冲信号进行计数。效果还不错。 具体设置如下: /* TIM3_CH2 为脉冲输入口 1. 配置GPIO_GPIOA_PIN7 输入 2. 配置TIM3 计数器在TI2 端的上升沿计数: 1). TIMx_CCMR1: CC2S =01; 配置通道2检测TI2输入的上升沿 2). TIMx_CCMR1:IC2F =000; 选择输入滤波器带宽 3). TIMx_CCER: CC2P =0; 配置上升沿极性 √ 4). TIMx_SMCR: SMS =111; 选择定时器外部时钟模式1 5). TIMx_SMCR: TS =110; 选择TI2作为触发输入源 √
[单片机]
使用STM32调试FMSDR模块及解调FM电台(3)
3. 调试8027使其发出单音FM信号 3.1 输出24Mhz和验证I2C接口 1. 硬件连接 将FM_SDR板卡和STM32H750开发板连接。 本文中所有例子中我们都仅给MSI001使用天线,因为QN8027离得很近,发射端不需要使用天线 本程序中操作的管脚如下描述: 2. PWM输出24MHz QN8027芯片需要输入24MHz的时钟作为参考信号,在这里通过STM32H750的TIMER2产生24M的方波,提供给QN8027作为输入参考信号。 PWM信号的关键参数是频率和占空比,我们分别看一下如何设定TIM2来确定输出PWM的频率和占空比: PWM的输出频率=计数器计数频率/(计数器的计数上限+1),计数器计数频
[单片机]
使用<font color='red'>STM32</font>调试FMSDR模块及解调FM电台(3)
STM32基础知识:中断系统
中断系统 1 数据传输方式 无条件传输 :处理器不必了解外部设备状态,直接进行数据传输,用于指示灯和按键等简单设备.。 查询方式 :传输前,一方先查询另一方的状态,若已经准备好就传输,否则就继续查询。 中断方式 :一方通过申请中断的方式与另一方进行数据传输,收发双方可以并行工作。 直接存储器访问 :处理器内部建立片内外设和内存之间的数据传输通道,传输过程不需要处理器参与。 2 中断系统的基本概念 2.1 中断全过程 中断发生: 当CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理。 中断处理: CPU暂停当前的工作,转去处理事件B。 中断返回: 当CPU将事件B处理完毕后,再回到事件A中被暂停的地方继
[单片机]
<font color='red'>STM32</font>基础知识:中断系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved