我正在使用 STM32 F3 发现套件并开始弄乱 SPI 外围设备。我从一个简单的环回系统开始:我检查 TXFIFOLVL 状态,如果它未满,我将数据发送到 DR 寄存器,然后应该环回我的 RxBuffer(当 RXFIFOLVL 不为空时,我从 DR 读取数据),但我遇到了一个问题——我的接收缓冲区没有得到任何东西,我似乎不明白为什么。我不使用 HAL 或标准外设库,所以我配置 SPI 并通过如下寄存器值使用它:
SPI 代码的头文件:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #define SPI1_CLOCK_ENABLE 0b1<<12 // Enable SPI1 clock in APB2ENR register #define SPI1_PIN_ALT_FNC 0b1010<<4 // Sets PA5,PA6 & PA7 to Alternative function #define SPI1_OUTPUT_TYPE ~(0b111<<5) // Sets PA5, PA6 & PA7 to push-pull #define SPI1_PIN_SPEED 0b1111<<4 // Sets pins from 4 to 7 to work on 50 MHz output speed #define SPI1_PIN_ALT_FNC_LOW 0b0101<<4 // Sets the Alternative function to AF5 in alternative function low register #define SPI1_PIN_ALT_FNC_HIGH 0b0101<<4 // Sets the Alternative function to AF5 in alternative function high register #define SPI1_BAUDRATE_PRESCALER_2 0b000<<3 // F_PCLK/2 #define SPI1_BAUDRATE_PRESCALER_128 0b110<<3 // F_PCLK/128 #define SPI1_MASTER_MODE 0b1<<2 // Sets the SPI1 to master mode #define SPI1_PERI_ENABLE 0b1<<6 // Enable the SPI peripheral #define SPI1_SSM_ENABLE 0b1<<9 // Enable SPI software slave management #define SPI1_SSI_ENABLE 0b1<<8 // SPI1 internal slave select #define SPI1_NSSP_ENABLE 0b1<<3 // Enable NSS pulse management #define SPI1_FRXTH_8BIT 0b1<<12 //Set the FIFO reception threshold to 8 bits #define SPI1_DATA_SIZE 0b0111<<8 // SPI1 DATA size #define SPI1_TXFIFO_FULL_FLAG 0b11<<11 // SPI1 Tx FIFO transmission flag #define SPI1_RXFIFO_EMPTY_FLAG 0b00<<9 // SPI1 Rx FIFO reception flag #include"main.h" #include"stm32f3xx_hal.h" void spi_init(); void spi_WriteRead(uint8_t *rxBuffer, uint8_t *txBuffer, uint8_t bufferSize); |
SPI 代码的代码文件:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | /* SPI1 configuration * PA5 - SCK * PA6 - MISO * PA7 - MOSI */ void spi_init(){ // Start the GPIO and peripheral clocks in Reset and Clock Control register RCC->AHBENR |= GPIOA_ENABLE; RCC->APB2ENR |= SPI1_CLOCK_ENABLE; // Configure the GPIOs for SPI communication GPIOA->MODER |= SPI1_PIN_ALT_FNC; GPIOA->OTYPER &= SPI1_OUTPUT_TYPE; GPIOA->OSPEEDR |= SPI1_PIN_SPEED; GPIOA->AFR[0] |= SPI1_PIN_ALT_FNC_LOW; GPIOA->AFR[1] |= SPI1_PIN_ALT_FNC_HIGH; // Configure the SPI peripheral SPI1->CR1 |= SPI1_BAUDRATE_PRESCALER_2; SPI1->CR1 |= SPI1_SSM_ENABLE; SPI1->CR1 |= SPI1_MASTER_MODE; SPI1->CR1 |= SPI1_SSI_ENABLE; SPI1->CR2 |= SPI1_DATA_SIZE; SPI1->CR2 |= SPI1_FRXTH_8BIT; SPI1->CR2 |= SPI1_NSSP_ENABLE; SPI1->CR1 |= SPI1_PERI_ENABLE; SPI1->CR1 &= ~SPI1_SSI_ENABLE; } void spi_WriteRead(uint8_t *rxBuffer, uint8_t *txBuffer, uint8_t bufferSize){ int i; while((SPI1->SR & 0b11<<11)==SPI1_TXFIFO_FULL_FLAG); for(i=0;i<bufferSize;i++){ SPI1->DR |= *txBuffer; // send *txBuffer++ txBuffer++; while((SPI1->SR & 0b11<<9)!=SPI1_RXFIFO_EMPTY_FLAG){ *rxBuffer = SPI1->DR; rxBuffer++; } } } |
在 main 中,我简单地定义我的缓冲区并像这样初始化它们:
2 | uint8_t tx_buff[SIZE] = {1,2,3,4,5,6,7,8,9,10}; |
所以在调用我的 spi_WriteRead() 函数之后,我自然希望这些缓冲区具有相同的值。
我调用我的 spi_init() 函数并在我的 while 循环中调用 spi_WriteRead() 函数:
SIZE 在我的 main.c 中定义为:
我使用 SW4STM32 环境进行编码和调试,所以在我的调试器中我可以看到所有的寄存器值。我的 SPI 就像我定义的那样被初始化,我的数据被发送到 TXFIFO 缓冲区,但没有任何东西进入 RXFIFO 缓冲区。如果我检查 SPI SR 寄存器,我可以看到我的 TXFIFO 已满,但 RXFIFO 标志说它是空的。
有没有人知道我可能做错了什么?我是否严重误解了关于 SPI 的一些简单信息?感谢您的输入!
编辑:
好好看看这里:
2 3 4 | ... SPI1->CR1 |= SPI1_PERI_ENABLE; SPI1->CR1 &= ~SPI1_SSI_ENABLE; |
现在您可能知道为什么
2 | SPI1->CR1 &= ~0b1<<8; |
相当于:
2 | SPI1->CR1 &= (~0b1)<<8; |
更进一步:
2 | SPI1->CR1 &= 0xffffff00; |
可能不是你想要的。
您还应该知道,如果您的设备是主设备,那么 SSI 和 SSM 位都应该设置。 https://stackoverflow.com/a/42169600/157344
原件:
请注意,在这些设备中,当您直接访问
2 | (volatile uint8_t*)SPI1->DR = writeByte; |
顺便说一句 - 为什么不使用 CMSIS 标头提供的#defines?您不必定义诸如
之类的东西
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
我已经看到了一些其他的问题,尝试了他们的建议,但没有一个对我有用。我已经使用Rails大约一年了,刚刚开始一个新的Rails项目,突然遇到了问题。我卸载并尝试重新安装所有Ruby和Rails。Ruby很好,但Rails不行。当我输入railss时,我得到了can'tfindgemrailties。我当前的Ruby版本是ruby2.2.2p95(2015-04-13修订版50295)[x86_64-darwin15],尽管我一直在尝试通过rbenv设置ruby2.3.0。如果我尝试rails-v查看我正在运行的版本,我会得到同样的错误。我使用的是MacOSXElCapitan版本10
我花了几天时间尝试安装ruby1.9.2并让它与gems一起工作:-/我最终放弃了我的MacOSX10.6机器,下面是我的Ubuntu机器上的当前状态。任何建议将不胜感激!#rubytest.rb:29:in`require':nosuchfiletoload--mongo(LoadError)from:29:in`require'fromtest.rb:1:in`'#cattest.rbrequire'mongo'db=Mongo::Connection.new.db("mydb")#gemwhichmongo/usr/local/rvm/gems/ruby-1.9.2-p0/g
我正在尝试以一种更类似于普通RubyGem结构的方式构建我的Sinatra应用程序。我有以下文件树:.├──app.rb├──config.ru├──Gemfile├──Gemfile.lock├──helpers│ ├──dbconfig.rb│ ├──functions.rb│ └──init.rb├──hidden│ └──Rakefile├──lib│ ├──admin.rb│ ├──api.rb│ ├──indexer.rb│ ├──init.rb│ └──magnet.rb├──models│ ├──init.rb│ ├──invite.rb│ ├─
我正在尝试在SUSEEnterprise11SP3上安装compass。我得到以下信息。有什么想法吗?geminstallcompassBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingcompass:ERROR:Failedtobuildgemnativeextension./usr/bin/rubyextconf.rbmkmf.rbcan'tfindheaderfilesforrubyat/usr/lib64/ruby/ruby.hextconffailed,exitcode1Gemfileswi
我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia
我的heroku应用崩溃了,因为它找不到模块“SecureRandom”。我在gemfile中指定了我的Ruby版本,我的计算机、gemfile和Heroku似乎都匹配Ruby版本号,尽管不是补丁号。其他帖子建议将usr/bin/heroku指向特定的Ruby文件,但我不确定该怎么做(我的应用程序中没有Herokubin)。这看起来像是Ruby版本错误。我该如何解决这个问题?classOrderItemHeroku日志:/app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/dependenci
我目前正在做一个需要在ubuntu11.04上使用rackup命令的项目,但我收到一个错误:-bash:rackup:commandnotfound。我已经安装了rails和rackrubygems。任何帮助都会很棒! 最佳答案 如果你正在使用bundler那么也许你需要使用bundleexecbundleexecrackup 关于ruby-rackup:找不到命令,我们在StackOverflow上找到一个类似的问题: https://stackover