我正在使用STM32F103ZE 我没有正确获取SPI数据。 师父正确传播。 但是在发送非零值时总是读为零。
主配置:(MSP430)
The master configuration is correct. (I tested it.) Master Mode, MSB First, 8-bit SPI, Inactive state is high, SS grounded, 1 MHz clock, no dividers
Slave Config(STM32F103ZE)
Using SPI2. SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx SPI_InitStructure.SPI_Mode = SPI_Mode_Slave SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b SPI_InitStructure.SPI_CPOL = SPI_CPOL_High SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge SPI_InitStructure.SPI_NSS = SPI_NSS_Soft SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB SPI_InitStructure.SPI_CRCPolynomial = 7
任何人都有答案,
由于 哈里
答案 0 :(得分:5)
我知道,问题已经很久了。尽管如此,由于我在最后几天遇到了同样的问题,我将尽力为未来的读者提供答案。
以下代码适用于STM32F407,它在STM32发现板上使用。从数据表中可以看出,SPI外设与STM32F103相同,所以 我希望代码能够在没有修改的情况下在另一个微控制器上运行。
#include "stm32f4xx.h"
[... configure the pins SCK, MISO, MOSI and NSS ...]
// Configure the SPI as: Slave, 8 bit data, clock high when idle, capture on
// 1st edge, baud rate prescaler 2, MSB first.
SPI1->CR1 = SPI_CR1_CPOL;
// No interrupts, no DMA and Motorola frame format.
SPI1->CR2 = 0;
// Enable the peripheral.
SPI1->CR1 |= SPI_CR1_SPE;
// Wait until some data has been sent to the slave and print it.
while ((SPI1->SR & SPI_SR_RXNE) == 0);
printf("Received: %d\n", SPI1->DR);
在此初始化过程中,与问题中发布的代码有两点不同:
不要使用3行SCK,MISO和MOSI为普通SPI选择双向模式。 MISO和MOSI都是单向线。
我使用硬件从属选择管理,即未设置位SSM
。这样,
SPI外设可以自动检测器件何时被置位(引脚
NSS很低,并且会
将MOSI位存储在移位寄存器中。当读取了足够的位(8或
16取决于所选的数据格式),
标志RXNE
在状态寄存器中设置,可以读取传输的值
来自注册DR
。
希望有所帮助。
答案 1 :(得分:3)
我遇到了从数据寄存器获取0x00值的完全相同的问题。
在我的情况下,问题是MISO线被设置为浮动输入。将其更改为OType_PP后,它可以正常工作。这是我的STM32F429的配置代码:
void SPI1_Config(void){
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIOE->BSRRL |= GPIO_Pin_7;
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI1, &SPI_InitStruct);
SPI_Cmd(SPI1, ENABLE);}
发送功能:
uint8_t SPI1_Send(uint8_t data){
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, data);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);}