stm32f4-STM32F407 SPI的SPI1->DR寄存器值不变

问题描述

STM32F407 SPI的SPI1->DR寄存器值不变

如图寄存器状态,不知道怎么回事,网上也搜不到类似的问题>.<;;

理论上,执行 SPIx->DR = Data;后SPI的SR寄存器应该变为SPIx->SR=0x0000(我的所有脚都悬空),但是结果却是SPIx->SR=0x0003,而且DR的值不变任然是SPIx->DR=0x0000。
不知道怎么回事啊,小弟接触arm没多久,谢谢啦!
下面是部分代码,SPI初始化和main函数。

 //main.c
    SPI2Init();
    STM_EVAL_LEDInit(LED4);
    STM_EVAL_LEDInit(LED5);
        u32 temp=0;
        STM_EVAL_LEDToggle(LED4);
        while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
        SPI_I2S_SendData(SPI1,0x11);
        temp=0xfffff;
        while(temp) {temp--;}
        temp=0; 

 //SPI1Init.c
 void SPI1Init(void){

    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef  SPI_InitStructure; 

  //    Enable the SPI periph
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    //  Enable SCK, MOSI and MISO GPIO clocks
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
  //    Enable CS  GPIO clock
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

    GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_Init(GPIOB,&GPIO_InitStructure);

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI1, &SPI_InitStructure);
    SPI_Cmd(SPI1, ENABLE);  

      //Configure GPIO PIN for Lis Chip select
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
  //Deselect : Chip Select high
  GPIO_SetBits(GPIOA, GPIO_Pin_15);
}

解决方案

我在ADS1293上也遇到了这个问题,求解

时间: 2025-01-30 16:07:43

stm32f4-STM32F407 SPI的SPI1-&amp;gt;DR寄存器值不变的相关文章

stm32-STM32f4 USB与SPI数据传输

问题描述 STM32f4 USB与SPI数据传输 STM32f407芯片的SPi接口连接芯片采集数据,通过USB接口传输到PC机,请教怎么解决?用IAR编程需要什么?有什么例子吗?求大神指教啊! 解决方案 对于你说的,你要分以下几步解决:1.调通SPI协议,成功获取芯片采集数据.在调协议时,可以参照stm32的SPI例程,配置好各个寄存器. 2.调通SPI协议之后,就是调通你的USB协议了.尤其是其传输协议.这这方面也是有很多例程的. 3.电脑上位机.即你传输数据给电脑后,通过电脑上的上位机查看

Linux内核中SPI总线驱动分析

本文主要有两个大的模块:一个是SPI总线驱动的分析 (研究了具体实现的过程): 另一个是SPI总线驱动的编写(不用研究具体的实现过程).  1 SPI概述       SPI是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口,是Motorola首先在其MC68HCXX系列处理器上定义的.SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间.SPI是一种高速的,全双工,同步的通信总线,并且在芯片的

黑客内核:如何实现属于你的实时内核?

本文讲的是黑客内核:如何实现属于你的实时内核?, 概要: 本文的实时内核的实现是在没有使用任何类型的Linux内核的情况下进行的,实时内核的处理器主要是针对16位和32位Microchip MCU,RAM是从8 KB到32 KB,ROM是从128到512 KB. 我们通过采用RTOS(实时操作系统)以及自行迭代的T Neo源代码来实现自定义的实时内核 . 抢占式操作系统如何工作 运行多个线程,由于本文中的处理器是"单线程的":它们只能一次执行单个指令(这里只针对单核处理器).所以为了在

minidump详细介绍

Effective minidump  简介 在过去几年里,崩溃转储(crash dump)成为了调试工作的一个重要部分.如果软件在客户现场或者测试实验室发生故障,最有价值的解决方式是能够创建一个故障瞬间的应用程序状态镜像,然后可以在开发者的机器上通过调试器进行分析.第一代的crash dump通常被称为"全用户转储(full user dump)",它包含了进程的虚拟内存的全部内容.毫无疑问,这样的dump对于事后调试非常有价值.但是,这样的dump经常非常大,使得通过电子方式发送给

《OSPF和IS-IS详解》一6.1 OSPF数据库同步

6.1 OSPF数据库同步 OSPF和IS-IS详解 读至本章,读者想必知道,OSPF协议是一种结构性很强的路由协议.既然读者都清楚OSPF数据库同步的可靠性和精确性是如此重要,那么也就不会对用来管理OSPF数据库同步过程的状态机(名为邻居状态机)的复杂程度感到惊讶了.简而言之,在数据库同步过程中,邻居状态机会驱动(OSPF路由器)采取以下"行动". 1.当相邻的两台路由器决定彼此建立邻接关系时,会进行分工:一台起"主导"作用,另外一台会进行"配合&quo

《OSPF和IS-IS详解》一第6章 链路状态数据库同步6.1 OSPF数据库同步

第6章 链路状态数据库同步 OSPF和IS-IS详解 有一句话作者此前曾反复提及,现在再说一遍:链路状态路由协议的"精髓"在于,隶属同一区域的每台路由器都会根据存储在一个公共拓扑数据库里的信息,执行本机路由计算.因此,在同一区域内,每台路由器所存储的拓扑数据库的内容必须完全一样.路由器之间相互同步链路状态数据库的目的正是为此.在OSPF或IS-IS网络中,路由器只要上线运行,就必须与邻居路由器进行数据库同步,以确保各自所持数据库的内容完全相同.若路由器刚接入点到点链路,便会与链路对端的

NPOI 处理greatCell 超过4000行报错

问题描述 最近在用NPOI处理Excel03,主要是根据判断要求遍历修改单元格的背景色.第一次运行时候没问题,当第二次运行同一个表格的时候报错,提示为:Themaximumnumberofcellstyleswasexceeded.Youcandefineupto4000stylesina.xlsworkbook.当表格有修改后又不会报错.好像每次运行上一次CreatCell的都没释放掉一样,可是程序每次运行后我都把程序进程退出了啊.有人说把ICellStylestyle=myworkbook.

C# ASP.NET CSV文件导入数据库

原文:C# ASP.NET CSV文件导入数据库       using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.OleDb; using System.Data.Sql; using System.Data.SqlClient; using System.IO;   namespace HPRSP.CommonDataObject { pu

变量问题基础问题

问题描述 //读取广告位方法publicstringgetggw(intadtype,inttwhite,inttheight){dbclassd=newdbclass();SqlDataReaderdr=d.er("select*fromadwhereatype="+adtype);stringpicurl;while(dr.Read()){picurl=dr["aphoto"].ToString();}return"<imgsrc=/File/I