初级会员

- 积分
- 66
- 金钱
- 66
- 注册时间
- 2021-1-8
- 在线时间
- 24 小时
|
如题 例程是正常的 根据例程 把SPI改成了dma模式 然后读写就不正常 读出来都是0x00 没法确定是读不正常 还是写不正常 代码如下 有大佬能帮忙分析下可能的原因吗
测试的时候就是wrtie_page 在地址0x00写32个数据,然后read读地址0x00
- SPI_HandleTypeDef hspi1;
- DMA_HandleTypeDef hdma_spi1_rx;
- DMA_HandleTypeDef hdma_spi1_tx;
- static uint16_t W25QXX_ID = 0;
- static uint8_t SPI2_ReadWriteOneByte(uint8_t data)
- {
- uint8_t receive = 0;
-
- HAL_SPI_TransmitReceive_DMA(&hspi1, &data, &receive, 1);
-
- return receive;
- }
- static void W25QXX_Write_Enable(void)
- {
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
-
- SPI2_ReadWriteOneByte(W25X_WriteEnable);
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
- }
- static void W25QXX_Write_Disable(void)
- {
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
-
- SPI2_ReadWriteOneByte(W25X_WriteDisable);
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
- }
- static uint8_t W25QXX_Read_SR(uint8_t num)
- {
- uint8_t res = 0, cmd = 0;
-
- switch(num)
- {
- case 1:
- cmd = W25X_ReadStatusReg1;
- break;
-
- case 2:
- cmd = W25X_ReadStatusReg2;
- break;
-
- case 3:
- cmd = W25X_ReadStatusReg3;
- break;
-
- default:
- cmd = W25X_ReadStatusReg1;
- break;
- }
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
-
- SPI2_ReadWriteOneByte(cmd);
- res = SPI2_ReadWriteOneByte(0xff);
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
-
- return res;
- }
- static void W25QXX_Write_SR(uint8_t num, uint8_t data)
- {
- uint8_t cmd = 0;
-
- switch(num)
- {
- case 1:
- cmd = W25X_ReadStatusReg1;
- break;
-
- case 2:
- cmd = W25X_ReadStatusReg2;
- break;
-
- case 3:
- cmd = W25X_ReadStatusReg3;
- break;
-
- default:
- cmd = W25X_ReadStatusReg1;
- break;
- }
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
-
- SPI2_ReadWriteOneByte(cmd);
- SPI2_ReadWriteOneByte(data);
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
- }
- static void W25QXX_Wait_Busy(void)
- {
- while((W25QXX_Read_SR(1) & 0x01) == 0x01);
- }
- static uint16_t W25QXX_Read_ID(void)
- {
- uint16_t res = 0;
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
-
- SPI2_ReadWriteOneByte(W25X_ManufactDeviceID);
- SPI2_ReadWriteOneByte(0x00);
- SPI2_ReadWriteOneByte(0x00);
- SPI2_ReadWriteOneByte(0x00);
-
- res |= SPI2_ReadWriteOneByte(0xff) << 8;
- res |= SPI2_ReadWriteOneByte(0xff);
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
-
- return res;
- }
- void W25QXX_Read(uint8_t *buffer, uint32_t addr, uint16_t byte)
- {
- uint16_t i;
-
- rt_base_t level = 0;
-
- level = rt_hw_interrupt_disable();
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
-
- SPI2_ReadWriteOneByte(W25X_ReadData);
-
- SPI2_ReadWriteOneByte((uint8_t)(addr >> 16));
- SPI2_ReadWriteOneByte((uint8_t)(addr >> 8));
- SPI2_ReadWriteOneByte((uint8_t)(addr));
-
- for(i = 0; i < byte; i++)
- {
- buffer[i] = SPI2_ReadWriteOneByte(0xff);
- }
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
-
- rt_hw_interrupt_enable(level);
- }
- void W25QXX_Write_Page(uint8_t *buffer, uint32_t addr, uint16_t byte)
- {
- uint16_t i;
- rt_base_t level = 0;
-
- level = rt_hw_interrupt_disable();
-
- W25QXX_Write_Enable();
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
-
- SPI2_ReadWriteOneByte(W25X_PageProgram);
-
- SPI2_ReadWriteOneByte((uint8_t)(addr >> 16));
- SPI2_ReadWriteOneByte((uint8_t)(addr >> 8));
- SPI2_ReadWriteOneByte((uint8_t)(addr));
-
- for(i = 0; i < byte; i++)
- {
- SPI2_ReadWriteOneByte(buffer[i]);
- }
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
-
- W25QXX_Wait_Busy();
-
- rt_hw_interrupt_enable(level);
- }
- void W25QXX_Init(void)
- {
- __HAL_RCC_DMA2_CLK_ENABLE();
- HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 1, 0);
- HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
- HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 1, 0);
- HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
- hspi1.Instance = SPI1;
- hspi1.Init.Mode = SPI_MODE_MASTER;
- hspi1.Init.Direction = SPI_DIRECTION_2LINES;
- hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
- hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
- hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
- hspi1.Init.NSS = SPI_NSS_SOFT;
- hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
- hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
- hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
- hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
- hspi1.Init.CRCPolynomial = 10;
-
- if (HAL_SPI_Init(&hspi1) != HAL_OK)
- {
- Error_Handler();
- }
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
- uint8_t mode = 0;
-
- W25QXX_ID = W25QXX_Read_ID();
- if(W25QXX_ID == W25Q256)
- {
- mode = W25QXX_Read_SR(3);
- if((mode & 0x01) == 0)
- {
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
-
- SPI2_ReadWriteOneByte(W25X_Enable4ByteAddr);
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
- }
- }
-
- printf("the ID is %x\r\n", W25QXX_ID);
- }
复制代码
|
|