我正在 STM32F429 上使用 SPI 将数据写入 MX25V1006F 闪存。我没有使用 cubeMX 库。
我的问题是它工作了一段时间,然后突然就不起作用了。我已经多次更换 MCU,但我一次又一次地遇到同样的问题。当检查 SPI 引脚上的内部保护二极管(0.8V 或短路)时,测量值不同于良好的 MCU SPI 引脚(0.6V)。会不会是硬件问题或者软件问题。我将 MOSI 和 MISO 引脚分别直接连接到闪存 MISO 和 MOSI 引脚,中间没有电阻。这可能是 SPI 引脚消失的原因吗?
据我了解,SPI 引脚不需要上拉。通过参考互联网资源,我将 MISO 引脚连接到 3.3K 上拉但没有变化。
我降低了 SPI 数据速度,但我遇到了同样的问题。
我检查了 SPI 上的波形,在一个 STM32F429 MCU 上根本没有波形,在另一个 STM32F429 MCU 上只有没有 MOSI 变化的 SCK 波形。我怀疑这是硬件问题,但我无法追踪到它。在我的板上,SPI1(PortB 3、4、5)没有其他代码或功能冲突
这是我的 SPI 代码
- void SPI_Flash_Port_Init(void)
- {
- SPI_InitTypeDef SPI_InitStruct;
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
- // spi1 cs setting
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOB, &GPIO_InitStructure); // Name: EX_IO1 -> CS
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_Init(GPIOB, &GPIO_InitStructure); // I2C2_SDA -> Flash WP, HOLD
- // spi1 miso, mosi, sck setting
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE); // APB2CLK = 84Mhz, APB2Timer = 168Mhz
- GPIO_PinAFConfig(SPI1_SCL_Port, GPIO_PinSource3, GPIO_AF_SPI1);
- GPIO_PinAFConfig(SPI1_MISO_Port, GPIO_PinSource4, GPIO_AF_SPI1);
- GPIO_PinAFConfig(SPI1_MOSI_Port, GPIO_PinSource5, GPIO_AF_SPI1);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_InitStructure.GPIO_Pin = SPI1_SCL_Pin; GPIO_Init(SPI1_SCL_Port, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = SPI1_MISO_Pin; GPIO_Init(SPI1_MISO_Port, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = SPI1_MOSI_Pin; GPIO_Init(SPI1_MOSI_Port, &GPIO_InitStructure);
- SPI_I2S_DeInit(SPI1);
- 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_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
- // SPI_BaudRatePrescaler_2 // clk = 84 / 2 = 42.0 Mhz
- // SPI_BaudRatePrescaler_4 // clk = 84 / 4 = 21.0 Mhz
- // SPI_BaudRatePrescaler_8 // clk = 84 / 8 = 10.5 Mhz
- // SPI_BaudRatePrescaler_16 // clk = 84 / 16 = 5.2 Mhz
- // SPI_BaudRatePrescaler_32 // clk = 84 / 32 = 2.6 Mhz
- // SPI_BaudRatePrescaler_64 // clk = 84 / 64 = 1.3 Mhz
- // SPI_BaudRatePrescaler_128 // clk = 84 / 128 = 0.6 Mhz
- // SPI_BaudRatePrescaler_256 // clk = 84 / 256 = 0.3 Mhz
- SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
- SPI_InitStruct.SPI_CRCPolynomial = 7;
- SPI_Init(SPI1, &SPI_InitStruct);
- SPI_Cmd(SPI1, ENABLE);
- EX_IO1(1); // CS high
- GPIO_SetBits(IIC2_SDA_Port, IIC2_SDA_Pin); // WP/Hold always high
- }
- void Flash_Spi_SendByte(unsigned char byte_value)
- {
- while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}; SPI_I2S_SendData(SPI1,byte_value);
- while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){}; SPI_I2S_ReceiveData(SPI1); // Dummy rx
- }
- void Flash_Spi_ReadByte(unsigned int byte_count)
- {
- unsigned int i;
- for(i = 0; i < byte_count; i++)
- {
- Delay_us(5);
- SPI_Buffer = 0;
- while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}; SPI_I2S_SendData(SPI1,0); //dummy tx
- while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){}; SPI_Buffer = SPI_I2S_ReceiveData(SPI1);
- }
- }
- #define EX_IO1(x) x ? GPIO_SetBits(GPIOB, GPIO_Pin_8) : GPIO_ResetBits(GPIOB, GPIO_Pin_8)
- void Flash_Spi_CS(uint8_t value)
- {
- Delay_us(5);
- EX_IO1(value);
- Delay_us(5);
- }
- uint8_t Flash_Spi_ID_READ(unsigned char byte_count) // read a byte
- {
- Flash_Spi_CS(0); // CS = 0
- Flash_Spi_SendByte(FLASH_CMD_RDID);
- Delay_us(10);
- Flash_Spi_ReadByte(byte_count);
- Flash_Spi_CS(1); // CS = 1
- //Uart1_Printf("Chip ID READn");
- return true;
- }
0
|
1个回答
|
|
|