OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4883|回复: 2

探索者开发版 W25Q128能读到正确ID 但是读写数据不正常

[复制链接]

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2021-1-8
在线时间
24 小时
发表于 2021-4-15 16:48:09 | 显示全部楼层 |阅读模式
如题 例程是正常的 根据例程 把SPI改成了dma模式 然后读写就不正常 读出来都是0x00 没法确定是读不正常 还是写不正常 代码如下 有大佬能帮忙分析下可能的原因吗
测试的时候就是wrtie_page 在地址0x00写32个数据,然后read读地址0x00
  1. SPI_HandleTypeDef hspi1;
  2. DMA_HandleTypeDef hdma_spi1_rx;
  3. DMA_HandleTypeDef hdma_spi1_tx;

  4. static uint16_t W25QXX_ID = 0;

  5. static uint8_t SPI2_ReadWriteOneByte(uint8_t data)
  6. {
  7.         uint8_t receive = 0;
  8.        
  9.         HAL_SPI_TransmitReceive_DMA(&hspi1, &data, &receive, 1);
  10.        
  11.         return receive;
  12. }

  13. static void W25QXX_Write_Enable(void)
  14. {
  15.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
  16.        
  17.         SPI2_ReadWriteOneByte(W25X_WriteEnable);
  18.        
  19.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
  20. }

  21. static void W25QXX_Write_Disable(void)
  22. {
  23.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
  24.        
  25.         SPI2_ReadWriteOneByte(W25X_WriteDisable);
  26.        
  27.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
  28. }

  29. static uint8_t W25QXX_Read_SR(uint8_t num)
  30. {
  31.         uint8_t res = 0, cmd = 0;
  32.        
  33.         switch(num)
  34.         {
  35.                 case 1:
  36.                         cmd = W25X_ReadStatusReg1;
  37.                 break;
  38.                
  39.                 case 2:
  40.                         cmd = W25X_ReadStatusReg2;
  41.                 break;
  42.                
  43.                 case 3:
  44.                         cmd = W25X_ReadStatusReg3;
  45.                 break;
  46.                
  47.                 default:
  48.                         cmd = W25X_ReadStatusReg1;
  49.                 break;
  50.         }
  51.        
  52.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
  53.        
  54.         SPI2_ReadWriteOneByte(cmd);
  55.         res = SPI2_ReadWriteOneByte(0xff);
  56.        
  57.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
  58.        
  59.         return res;
  60. }

  61. static void W25QXX_Write_SR(uint8_t num, uint8_t data)
  62. {
  63.         uint8_t cmd = 0;
  64.        
  65.         switch(num)
  66.         {
  67.                 case 1:
  68.                         cmd = W25X_ReadStatusReg1;
  69.                 break;
  70.                
  71.                 case 2:
  72.                         cmd = W25X_ReadStatusReg2;
  73.                 break;
  74.                
  75.                 case 3:
  76.                         cmd = W25X_ReadStatusReg3;
  77.                 break;
  78.                
  79.                 default:
  80.                         cmd = W25X_ReadStatusReg1;
  81.                 break;
  82.         }       
  83.        
  84.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
  85.        
  86.         SPI2_ReadWriteOneByte(cmd);
  87.         SPI2_ReadWriteOneByte(data);
  88.        
  89.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
  90. }

  91. static void W25QXX_Wait_Busy(void)
  92. {
  93.         while((W25QXX_Read_SR(1) & 0x01) == 0x01);
  94. }

  95. static uint16_t W25QXX_Read_ID(void)
  96. {
  97.         uint16_t res = 0;
  98.        
  99.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
  100.        
  101.         SPI2_ReadWriteOneByte(W25X_ManufactDeviceID);
  102.         SPI2_ReadWriteOneByte(0x00);
  103.         SPI2_ReadWriteOneByte(0x00);
  104.         SPI2_ReadWriteOneByte(0x00);
  105.        
  106.         res  |= SPI2_ReadWriteOneByte(0xff) << 8;
  107.         res  |= SPI2_ReadWriteOneByte(0xff);
  108.        
  109.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
  110.        
  111.         return res;
  112. }

  113. void W25QXX_Read(uint8_t *buffer, uint32_t addr, uint16_t byte)
  114. {
  115.         uint16_t i;
  116.        
  117.         rt_base_t level = 0;
  118.        
  119.         level = rt_hw_interrupt_disable();
  120.        
  121.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
  122.        
  123.         SPI2_ReadWriteOneByte(W25X_ReadData);
  124.        
  125.         SPI2_ReadWriteOneByte((uint8_t)(addr >> 16));
  126.         SPI2_ReadWriteOneByte((uint8_t)(addr >> 8));
  127.         SPI2_ReadWriteOneByte((uint8_t)(addr));
  128.        
  129.         for(i = 0; i < byte; i++)
  130.         {
  131.                 buffer[i] = SPI2_ReadWriteOneByte(0xff);
  132.         }
  133.        
  134.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
  135.        
  136.         rt_hw_interrupt_enable(level);
  137. }

  138. void W25QXX_Write_Page(uint8_t *buffer, uint32_t addr, uint16_t byte)
  139. {
  140.         uint16_t i;

  141.         rt_base_t level = 0;
  142.        
  143.         level = rt_hw_interrupt_disable();
  144.        
  145.         W25QXX_Write_Enable();
  146.        
  147.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
  148.        
  149.         SPI2_ReadWriteOneByte(W25X_PageProgram);
  150.        
  151.         SPI2_ReadWriteOneByte((uint8_t)(addr >> 16));
  152.         SPI2_ReadWriteOneByte((uint8_t)(addr >> 8));
  153.         SPI2_ReadWriteOneByte((uint8_t)(addr));
  154.        
  155.         for(i = 0; i < byte; i++)
  156.         {
  157.                 SPI2_ReadWriteOneByte(buffer[i]);
  158.         }
  159.        
  160.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
  161.        
  162.         W25QXX_Wait_Busy();
  163.        
  164.         rt_hw_interrupt_enable(level);
  165. }

  166. void W25QXX_Init(void)
  167. {
  168.   __HAL_RCC_DMA2_CLK_ENABLE();

  169.         HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 1, 0);
  170.   HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);

  171.   HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 1, 0);
  172.   HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);

  173.   hspi1.Instance                                                                                                         = SPI1;
  174.   hspi1.Init.Mode                                                                                                 = SPI_MODE_MASTER;
  175.   hspi1.Init.Direction                                                                                 = SPI_DIRECTION_2LINES;
  176.   hspi1.Init.DataSize                                                                                 = SPI_DATASIZE_8BIT;
  177.   hspi1.Init.CLKPolarity                                                                         = SPI_POLARITY_LOW;
  178.   hspi1.Init.CLKPhase                                                                                 = SPI_PHASE_1EDGE;
  179.   hspi1.Init.NSS                                                                                                         = SPI_NSS_SOFT;
  180.   hspi1.Init.BaudRatePrescaler                                                 = SPI_BAUDRATEPRESCALER_16;
  181.   hspi1.Init.FirstBit                                                                                 = SPI_FIRSTBIT_MSB;
  182.   hspi1.Init.TIMode                                                                                         = SPI_TIMODE_DISABLE;
  183.   hspi1.Init.CRCCalculation                                                         = SPI_CRCCALCULATION_DISABLE;
  184.   hspi1.Init.CRCPolynomial                                                                 = 10;
  185.        
  186.   if (HAL_SPI_Init(&hspi1) != HAL_OK)
  187.   {
  188.     Error_Handler();
  189.   }
  190.        
  191.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);

  192.         uint8_t mode = 0;
  193.        
  194.         W25QXX_ID = W25QXX_Read_ID();
  195.         if(W25QXX_ID == W25Q256)
  196.         {
  197.                 mode = W25QXX_Read_SR(3);
  198.                 if((mode & 0x01) == 0)
  199.                 {
  200.                         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
  201.                        
  202.                         SPI2_ReadWriteOneByte(W25X_Enable4ByteAddr);
  203.                        
  204.                         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
  205.                 }
  206.         }
  207.        
  208.         printf("the ID is %x\r\n", W25QXX_ID);
  209. }
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-7-16
在线时间
30 小时
发表于 2021-4-15 20:33:23 | 显示全部楼层
你光想读写,不擦除页,写个毛呀。
回复 支持 反对

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2021-1-8
在线时间
24 小时
 楼主| 发表于 2021-4-16 08:35:34 | 显示全部楼层
zxm3916 发表于 2021-4-15 20:33
你光想读写,不擦除页,写个毛呀。

忘了忘了....
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 03:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表