STM32
直播中

罗星

8年用户 1575经验值
擅长:模拟技术
私信 关注
[问答]

求助,关于STM32F103中SPI Received Only的问题求解

一个已完成的硬件方案,重新用CUBE重新配置,功能是用SPI接口驱动一片ADC
SPI能够接收16位数据即可,PA5 (SCK) PA6(MISO)接ADC 的 SCK MOSI,ADC需要一个周期的矩型波控制启动转换 PA7接到ADC的CONV引脚上

硬件与配置 PA5 PA6 PA7
IO配置
PA5 ALT_PP (SPI_SCK)
PA6 INPUT_PP (SPI_MISO)
PA7 ALT_PP (tiM3_CH2) 用PWM方式产生脉冲

结果发现无论怎么配置TIM3 PA7死活得不到PWM脉冲,结果发现
CUBE给的代码中将SPI1 CR1的RXONLY为1,而原来的SPI1 CR1的RXONLY 为0
RXONLY改成0脉冲就有了
这个是TIM3_CH2有输出的SPI配置

只要点上RXONLY脉冲就没了
查找数据手册
1 clock and 1 unidirectional data wire (BIDIMODE=0)
In this mode, the application can use the SPI either in transmit-only mode or in receive-only
mode.
● Transmit-only mode is similar to full-duplex mode (BIDIMODE=0, RXONLY=0): the data
are transmitted on the transmit pin (MOSI in master mode or MISO in slave mode) and
the receive pin (MISO in master mode or MOSI in slave mode) can be used as a
general-purpose IO. In this case, the application just needs to ignore the Rx buffer (if
the data register is read, it does not contain the received value).
In receive-only mode, the application can disable the SPI output function by setting the
RXONLY bit in the SPI_CR2 register.
In this case, it frees the transmit IO pin (MOSI in
master mode
or MISO in slave mode), so it can be used for other purposes.

按这个描述 正确做法是 设置RXONLY位 主模式的PA7就被释放出来,可做它用
而事实确是相反
不知道是那里弄错了,还是有别的什么问题

回帖(1)

孙成红

2024-5-10 17:15:09
从您的描述来看,您在使用STM32F103的SPI接口驱动一片ADC,并且遇到了一些问题。首先,我们来梳理一下您的硬件连接和配置:

1. PA5 (SCK) 连接到 ADC 的 SCK
2. PA6 (MISO) 连接到 ADC 的 MISO
3. PA7 连接到 ADC 的 CONV 引脚
4. PA5 配置为 ALT_PP (SPI_SCK)
5. PA6 配置为 INPUT_PP (SPI_MISO)
6. PA7 配置为 ALT_PP (TIM3_CH2)

您提到的问题是在尝试使用TIM3的PA7产生PWM脉冲时,发现没有脉冲输出。经过检查,您发现CUBE生成的代码中将SPI1 CR1的RXONLY设置为1,而原来的设置为0。在将RXONLY设置回0后,PWM脉冲正常输出。

现在,我们来分析这个问题:

1. SPI接口的工作原理是全双工通信,即可以同时进行发送和接收操作。但是,在某些应用场景下,我们可能只需要接收数据,而不需要发送数据。这时,我们可以将SPI配置为接收模式(Receive Only Mode),即RXONLY设置为1。

2. 在您的应用中,您需要通过SPI接口接收ADC的16位数据。当RXONLY设置为1时,SPI接口将只接收数据,而不发送数据。这可能导致您的TIM3_CH2无法正常产生PWM脉冲。

3. 将RXONLY设置为0后,SPI接口恢复为全双工通信模式,这时TIM3_CH2可以正常产生PWM脉冲。

为了解决这个问题,您可以尝试以下方法:

1. 保持RXONLY为0,确保SPI接口可以正常进行全双工通信。

2. 在产生PWM脉冲之前,确保SPI接口已经完成了数据接收操作。您可以通过查询SPI接口的状态标志(如SPI_RXNE)来实现这一点。

3. 如果您的ADC需要在接收数据之前启动转换,您可以在发送PWM脉冲之前,通过SPI接口发送一个特定的命令或数据来启动ADC的转换。

4. 在接收到ADC的数据后,您可以根据需要对数据进行处理,例如转换为电压值或进行滤波等。

通过以上步骤,您应该可以实现使用STM32F103的SPI接口驱动ADC,并正常接收16位数据,同时通过TIM3_CH2产生PWM脉冲来控制ADC的启动转换。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分