STM32F103做从机SPI通信SPI3中断异常

2019-08-15来源: eefocus关键字:STM32F10  从机  SPI通信  SPI3  中断异常

在做AM335D板子与STM32F103使用SPI通信时,需要用到STM32的从机模式,所以特别对于ST的从机模式进行了研究,由于硬件上使用的是STM32F103的SPI3,所以过程中遇到了一点麻烦,这里记录一下过程,以备查阅:


使用SPI3通信时,从机时钟产生不了中断,经过查阅资料,是因为spi3的nss口与JTAG有共用引脚,所以配置错误会导致SPI3无法使用。需要注意以下两点就可以了:

1.开启GPIO时钟的同时,开启AFIO时钟,如下:


RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE );    

2.关闭JTAG功能,使能SWD 如下:


GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE) ;


其他的SPI口正常配置,因为板子重启后默认为JTAG模式,所以注意千万不要使用GPIO_Remap_SWJ_Disable ,一旦这样就不能下载程序了,要使用ST的那个工具专门烧录。


以下是具体的代码:


extern u8 SPI3_Buffer_Rx[];

extern u8 RxIdx ;

u16 net_spi_Write(void);

 

void SPI3_Slave_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

    //GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE );             

    //RCC_APB2Periph_AFIO很重要

RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI3, ENABLE );

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE) ; //disable掉JTAG复用,很重要

 

/* MISO设置为推挽输出 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);

 

/* SCK和MOSI设置为下拉输入 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

GPIO_Init(GPIOB, &GPIO_InitStructure);

 

SPI3_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 

SPI3_InitStructure.SPI_Mode = SPI_Mode_Slave;

SPI3_InitStructure.SPI_DataSize = SPI_DataSize_8b;

SPI3_InitStructure.SPI_CPOL = SPI_CPOL_Low;

SPI3_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;

SPI3_InitStructure.SPI_NSS = SPI_NSS_Soft;

SPI3_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //

SPI3_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

SPI3_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPI3, &SPI3_InitStructure);  //

SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_RXNE, ENABLE); 

 

SPI_Cmd(SPI3, ENABLE); 

//SPI1_ReadWriteByte(0xff);  

}   

 

  

void SPI3_SetSpeed(u8 SpeedSet)

{

SPI3_InitStructure.SPI_BaudRatePrescaler = SpeedSet ;

    SPI_Init(SPI3, &SPI3_InitStructure);

SPI_Cmd(SPI3,ENABLE);

 

 

u8 SPI3_ReadWriteByte(u8 TxData)

{

u8 retry=0;

while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET) //发送缓存标志位

    {

retry++;

if(retry>200)return 0;

}   

SPI_I2S_SendData(SPI3, TxData); //发送数据

retry=0;

 

while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)//接收缓存标志位

{

retry++;

if(retry>200)return 0;

}       

return SPI_I2S_ReceiveData(SPI3); //返回接收到的数据     

}

 

void SPI_net_Init(void)

{

SPI3_Slave_Init();    

 

void NVIC_config(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = SPI3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

 

void SPI3_IRQHandler(void) 

{

volatile uint8_t data;

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

while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)

{

}

SPI3_Buffer_Rx[RxIdx++] = SPI_I2S_ReceiveData(SPI3);

while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET)

{

}

SPI_I2S_ClearITPendingBit(SPI3, SPI_I2S_IT_RXNE);

}

 

void net_spi_read_loop(void)

{

u8 i;

while (1)

  {

     if(RxIdx>=10)

     {

        SPI_Cmd(SPI3, DISABLE);

        RxIdx=0;

printf("rcv full:n");

        for(i=0;i<10;i++)

           printf("0x%02X ",SPI3_Buffer_Rx[i]);

printf("rn ");

memset(SPI3_Buffer_Rx,0,10);

    SPI_Cmd(SPI3, ENABLE);

 

     }

  }

}


关键字:STM32F10  从机  SPI通信  SPI3  中断异常

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471206.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32待机模式Standby Mode与ADC DMA模式测试备忘
下一篇:初探STM32 SPI2中断接收多组数据的处理方式

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

【STM32F103】中断综述

一、中断内核: STM32的中断很强大,每个外设都可以产生中断,F103在内核水平上搭载了异常响应系统,系统异常有8个(算上RESET和HardFault也就10个),外部中断有60个,但是根据NVIC(嵌套向量中断控制器,控制整个芯片中断相关的功能),IP(中断优先级寄存器)数组中预留了240个位置(NVIC结构如上图),可见眼光之远,用于扩展,这是STM32F103用不到这么多。如果以后要找跟内核相关的函数,都存在core_cm3.c和misc.c中,包括NVIC的函数的声明,但是其具体的库函数内容并不是和固件库头文件core_cm3.h一致(不在core_cm3.c),而是放在库函数的misc.c中,这点需要
发表于 2019-08-23
【STM32F103】中断综述

关于由CubeMx生成stm32f4+freertos,不正常分析之堆栈大小设置

freertos官方手册上有说,移植中出现的问题大多数是由堆栈设置不合理造成的,今天结合自身遇到问题分析一下1.任务堆栈设置过小,很容易造成硬件溢出,跳转到void HardFault_Handler(void);调试方法,可以通过调用函数,UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );来跟踪剩余堆栈,不过在CubeMx中的Configuration->FreeRtos->Include parameters中使能uxTaskGetStackHighWaterMark函数;2.整体设置过小,TOTAL_HEAP_SIZE
发表于 2019-08-23

CubeMX Stm32F407生成一定周期的占空比不同的方波DMA+定时器

先上图如图 是我生成的一个波形  这个波形的占空比在连续的四个周期内分别是10%,20%,30%,40%, 并且按照这个顺序循环这里大致介绍一下实现的方式。使用的软件是Cubemx(库函肯定也可以实现)第一步是器件选型  这一部分不做介绍  用的是Stm32F407第二是时钟配置接下来是定时器配置 第三步就是生成代码了这里 需要在生成的代码里面加上一行开始的代码。
发表于 2019-08-23
CubeMX Stm32F407生成一定周期的占空比不同的方波DMA+定时器

STM32F103控制舵机

//TIM4 PWM部分初始化 //PWM输出初始化//arr:自动重装值//psc:时钟预分频数void TIM4_PWM_Init(u16 arr,u16 psc){   GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; TIM_OCInitTypeDef  TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器3时钟 
发表于 2019-08-23

基于STM32F103ZET6主控平台实现定时器TIM3的驱动

_Clock_Init(9);   //系统时钟设置 delay_init(72);     //延时初始化 uart_init(72,115200); //串口初始化为115200 LED_Init(); BEEP_Init(); TIM3_Init(4999,7199); while(1) { if(Wl_stat==0)//代表进入WHILE循环 { printf("Input While(1)-->rn"); Wl_stat=1; } LED1=!LED1; delay_ms(200); }} 第四步:编译通过后,烧录进STM32F103ZET6开发板,实现
发表于 2019-08-22

STM32f103ZET6定时器TIM3使用通道1输出PWM程序

总结:TIM3_CH1输出口为PA6(重映射为PB4),PB5位DS0接口。1.使用重映射之后,原始IO口不再有输出;本例子中,若使用部分重映射,则 PA6映射到PB4中,所以仅仅PB4有波形输出;飞线连接PB4与PB5即可观察PWM呼吸灯效果。2.使用IO口前务必初始化,本例子中开始仅仅初始化了PB5口,而没有初始化PA6导致一直验证失败;正点原子给出程序中是由通道2直接映射到PB5因此只需要初始化PB5口即可,不存在上述问题。3.除了正常输出输入信号之外,输出PWM以及其他功能均属于IO口的复用功能。#include "stm32f10x.h"#include "led.h"
发表于 2019-08-22

小广播

何立民专栏

单片机及嵌入式宝典

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

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