- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 STM32F072RBuC 通过 SPI2
接收和传输数据在具有以下配置的从属模式下:
CR1 = 0x0078
CR2 = 0x0700
AFRH = 0x55353500
MODER = 0xa2a0556a
寄存器APB1ENR
也已正确配置。
当前程序只检查RXNE
标志,从 DR
中读取接收到的数据并发送一个随机值写入 DR
.
我收到数据时的状态寄存器有如下值:
SR = 0x1403
主机正确发送数据,我检查了从机引脚的信号(时钟相位和极性在两侧相同,并且在通过 MOSI 发送 SCK 和数据之前清除 NSS 信号)。
我什至将引脚配置为输入,我知道我可以读取主机发送的任何数字信号。在当前配置下,slave 似乎收到了一些东西,因为 RXNE
主机发送数据时置位,但读取值始终为0x00。
我尝试了不同的配置(软件/硬件 NSS、不同的数据大小等),但我总是得到 0x00。此外,我阅读后发送的随机值 DR
不发送到输出。
这是我当前的函数,它被连续调用:
unsigned char spi_rx_slave(unsigned char spiPort, unsigned char *receiveBuffer)
{
uint8_t temp;
static unsigned long sr;
if (!spi_isOpen(spiPort))
{
sendDebug("%s() Error: spiPort not in use!\r\n",__func__);
return false;
}
if (spiDescriptor[spiPort]->powerdown == true)
{
sendDebug("%s() Error: spiPort in powerdown!\r\n",__func__);
return false;
}
/* wait till spi is not busy anymore */
while((spiDescriptor[spiPort]->spiBase->SR) & SPI_SR_BSY)
{
sendDebug("SPI is busy(1)\r\n");
vTaskDelay(2);
}
sendDebug("CR1 = 0x%04x, ", spiDescriptor[spiPort]->spiBase->CR1);
sendDebug("CR2 = 0x%04x, ", spiDescriptor[spiPort]->spiBase->CR2);
sendDebug("AFRH address = 0x%08x, AFRH value = %08x, ", (unsigned long*)(GPIOB_BASE+0x24), *(unsigned long*)(GPIOB_BASE+0x24));
sendDebug("MODER address = 0x%08x, MODER value = %08x\r\n", (unsigned long*)(GPIOB_BASE), *(unsigned long*)(GPIOB_BASE));
sr = spiDescriptor[spiPort]->spiBase->SR;
while(sr & SPI_SR_RXNE)
{
/* get RX byte */
temp = *(uint8_t *)&(spiDescriptor[spiPort]->spiBase->DR);
spiDescriptor[spiPort]->spiBase->DR = 0x53;
sendDebug("-------->DR address = 0x%08x, data received: 0x%02x\r\n", &spiDescriptor[spiPort]->spiBase->DR, temp);
sendDebug("SR = 0x%04x\r\n", sr);
vTaskDelay(1);
sr = spiDescriptor[spiPort]->spiBase->SR;
}
while((spiDescriptor[spiPort]->spiBase->SR) & SPI_SR_BSY)
{
sendDebug("SPI is busy(2)\r\n");
vTaskDelay(2);
}
return true;
}
我做错了什么?有什么我没有正确配置的吗?
提前致谢。问候,哈维尔
我切换到软件 NSS 并复制了我在网上找到的 STM32CubeMX 示例中的寄存器值。我不能将这些库用于该项目,但我希望有相同的行为。
新值是:
CR1 = 0x0278
这意味着
CR2 = 0x1700
这意味着
RXNE
如果 FIFO 级别大于或等于 1/4(8 位),则生成事件。AFRH = 0x55303500
MODER = 0xa8a1556a
这意味着
我仍然得到相同的结果,并且使用这些库的评估套件可以正常使用 SPI1
反而。因此,肯定还有另一个与寄存器值无关的问题。
可能有任何时钟问题,例如引脚需要一些时钟吗?
谢谢!
最佳答案
这个问题指出了一些错误,这些错误可以解释为什么没有观察到接收:
GPIO 配置指向一些错误的备用功能/模式:这个问题没有准确说明,但我认为
AFRH = 0x55303500
MODER = 0xa8a1556a
指的是 GPIOB(否则,它对 SPI2 没有意义)。这对应于以下引脚配置(见 Reference Manual ,秒。 8.4.1、8.4.10 和 Datasheet ,表 16):
PB15 - Alternate Function - AF5 = [INVALID]
PB14 - Alternate Function - AF5 = [I2C2_SDA]
PB13 - Alternate Function - AF3 = [TSC_G6_IO3]
PB12 - GP Input (reset state)
PB11 - Alternate Function - AF3 = [TIM_CH4]
PB10 - Alternate Function - AF5 = [SPI2_SCK / I2S2_CK]
PB09 - GP Input (reset state)
PB08 - GP Output
PB07 - Alternate Function - (unknown which, see register AFRL)
PB06 - GP Output
PB05 - Alternate Function - (unknown which, see register AFRL)
PB04 - GP Output
PB03 - GP Output
PB02 - Alternate Function - (unknown which, see register AFRL)
PB01 - Alternate Function - (unknown which, see register AFRL)
PB00 - Alternate Function - (unknown which, see register AFRL)
这显然不是软件需要做的。
解决方案:确保配置PB15=>AF0、PB14=>AF0、PB13=>AF0或PB10 =>AF0,取决于您的硬件。
为了避免这样做的错误,您应该遵循@P__J__ 的提示,并为分配给 MODER、AFRH 等的常量使用说话宏。使用 ST 提供的 HAL 库在 SO 用户中是一个真正有争议的话题,但是人们真的应该考虑至少使用像 stm32f072xb.h
这样的头文件和像 这样的宏>GPIO_AFRH_AFSEL15
。如果将所有配置寄存器值表示为此类宏的(按位)或,则更容易根据数据表重新检查配置,而著名的 rubber duck会直接知道不开心的开发者在说什么。
其他时钟激活可能会丢失:这个问题证实了
The register
APB1ENR
is also properly configured.
这是正确的(只要第 14 位已设置)。
此外,GPIOB 必须通电,即。例如,必须设置 RCC_AHBENR
的第 18 位。再看看 Reference Manual ,秒。 6.4.8 和 6.4.6。
调试期间 GPIO 引脚可能处于错误模式:
I even configured the pins as inputs and I know I could read any digital signal the master could send. With the current configuration it seems the slave receives something because the RXNE is set when the master sends data but the read value is always 0x00.
请注意,对于每个 GPIO 引脚,通过 MODER
寄存器选择一个独特的模式。如果将其设置为“输入”(0b00
),备用功能将断开连接并且无法使用外部信号。
关于STM32F072RB 在从机模式下不通过 SPI 接收/发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44676996/
我正在对 JVM 上的 STM 技术进行一些研究。阅读了一些文档后,我对 Multiverse 的实现有些困惑。 根据 the Multiverse FAQ , Multiverse 不支持检测。然而
我想知道 Clojure 怎么可能已经实现了软件事务内存并且没有发现任何问题,而微软没有完成它的 C# 工作并注意到一些问题使得实现这里描述的 STM 不切实际: http://www.bluebyt
最后,我有以下设置 C:>哪里玩 C:\apps\play-2.2.0\play C:\apps\play-2.2.0\play.bat C:> 哪里 scala C:\apps\scala\bin\
我试图找出 Clojure 所称的 STM 与 Haskell 中实现的 STM 之间的区别。撇开实际的语言语义差异不谈,正如 Rich Hickey 在他的演讲中所说,Clojure 的 STM 实
阅读 Bartosz Milewski 的精彩作品 blog post在 STM 上,我很兴奋地阅读了以下内容: But take into account an important fact: ST
大家好, 在某些时候,我认为这些 stm 实现(我使用过一点点的多元宇宙......),被过度宣传了。因为在某些时候他们使用 CAS 来为他们提供操作的原子性。如果我直接使用 CAS 而不是使用这些实
haskell 的 stm 库中有一个函数,其类型签名如下: alwaysSucceeds :: STM a -> STM () 根据我对 Haskell 中 STM 的了解,在执行 STM 计算时,
在 Clojure 中,我们使用 STM 来实现并发。 我的问题是STM使用数据的时间点值,这是否会带来歧义? 我们如何知道访问了什么值? 最佳答案 Clojure 中的 STM 提供了(通过 ref
我需要有关用作原子更改日志的数据结构的建议。 我正在尝试实现以下算法。有流量传入更改更新内存中的映射。在类似 Haskell 的伪代码中它是 update :: DataSet -> Some
我正在尝试对这两个(软件事务内存和原子操作,我想两者不一样)进行一些基准测试,尽管我没有使用STM做太多事情(它似乎很难使用),但我成功地尝试了对基准测试进行计数,即所有线程将共享计数器递增 5000
我能够使用 STM 初始化状态并将其打印出来: module Main where import Control.Concurrent.STM data State = State {name ::
我读过两个关于 STM 如何实现的完全不同的描述。也许两者都是正确的,或者一个是错误的,我希望有人能阐明这一点。 Take 1(维基百科):允许所有线程修改共享内存,但事务中的每次读写都会被记录下来。
我知道将具有副作用的函数放在 STM 事务中通常是不好的做法,因为它们可能会被重试和调用多次。 然而,在我看来,您可以使用代理来确保只有在事务成功完成后才会执行副作用。 例如 (dosync //
我正在编写一个程序,其中大量代理监听事件并对其使用react。由于Control.Concurrent.Chan.dupChan已弃用我决定使用 TChan 的广告。 TChan 的表现比我预想的差很
我正在研究 Clojure 中的并发编程。 http://clojure.org/concurrent_programming 我了解到atom、ref和agent形式是用来维护程序状态的。 仅ref
你好,我正在阅读《clojure 的乐趣》这本书,在关于 STM 的部分中,他们有一个 2 个事务的图像,其中 A 最初从引用中检索与 B 相同的值,然后事务 A 和 B 都进行计算但 A 首先完成并
我熟悉Database transactions ,并花费了大量的时间调整isolation levels 。我从未在代码中实现过自己的事务模型。 我已通读 the source code对于 Clo
我有一个事务由于某种原因无限期失败,我想在内部使用跟踪指令。例如,要在执行此片段中的事务之前打印 MVar 的状态: data_out do putTMVar
当我们运行 STM 表达式时,它命中了 retry,线程被阻塞,如果条目被修改,事务将再次运行。 但我想知道: 如果我们读取一个 STM 变量,但在导致重试的特定分支中实际未使用该变量,更新它是否会尝
我正在研究 Clojure 中的并发编程。 http://clojure.org/concurrent_programming 我了解到atom、ref 和agent 表单用于维护程序状态。 只有 r
我是一名优秀的程序员,十分优秀!