[STM32F0] stm32f0 spi读写flash问题

[复制链接]
5000|5
 楼主| 胡斯哲 发表于 2014-2-25 12:45 | 显示全部楼层 |阅读模式
本帖最后由 胡斯哲 于 2014-2-25 15:57 编辑

用的是XX的程序,自己焊的板子
spi能够把W25Q16的flashID和deviceID读出来 ,分别是679509和20
单写进去一个1  读出示个255
求各位高手判断是哪的错误   或者给个f0的程序
mmuuss586 发表于 2014-2-25 13:47 | 显示全部楼层

只有AT45B的,基于F4。
可能芯片有问题吧

at45db.rar

1.8 KB, 下载次数: 20

1

sxhhhjicbb 发表于 2014-2-25 15:53 | 显示全部楼层
写命令用错了也是一种可能。
 楼主| 胡斯哲 发表于 2014-2-25 16:08 | 显示全部楼层
mmuuss586 发表于 2014-2-25 13:47
只有AT45B的,基于F4。
可能芯片有问题吧

先谢谢啦   
读的出id都会有问题吗?
 楼主| 胡斯哲 发表于 2014-2-25 16:16 | 显示全部楼层
本帖最后由 胡斯哲 于 2014-2-25 16:17 编辑
sxhhhjicbb 发表于 2014-2-25 15:53
写命令用错了也是一种可能。

写命令跟野火的程序几乎一样
就几个宏有差别
  1. /*******************************************************************************
  2. * Function Name  : SPI_FLASH_BufferWrite
  3. * Description    : Writes block of data to the FLASH. In this function, the
  4. *                  number of WRITE cycles are reduced, using Page WRITE sequence.
  5. * Input          : - pBuffer : pointer to the buffer  containing the data to be
  6. *                    written to the FLASH.
  7. *                  - WriteAddr : FLASH's internal address to write to.
  8. *                  - NumByteToWrite : number of bytes to write to the FLASH.
  9. * Output         : None
  10. * Return         : None
  11. *******************************************************************************/
  12. void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
  13. {
  14.   uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0;

  15.   Addr = WriteAddr % SPI_FLASH_PageSize;
  16.   count = SPI_FLASH_PageSize - Addr;
  17.   NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize;
  18.   NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;

  19.   if (Addr == 0) /* WriteAddr is SPI_FLASH_PageSize aligned  */
  20.   {
  21.     if (NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */
  22.     {
  23.       SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
  24.     }
  25.     else /* NumByteToWrite > SPI_FLASH_PageSize */
  26.     {
  27.       while (NumOfPage--)
  28.       {
  29.         SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
  30.         WriteAddr +=  SPI_FLASH_PageSize;
  31.         pBuffer += SPI_FLASH_PageSize;
  32.       }

  33.       SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
  34.     }
  35.   }
  36.   else /* WriteAddr is not SPI_FLASH_PageSize aligned  */
  37.   {
  38.     if (NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */
  39.     {
  40.       if (NumOfSingle > count) /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */
  41.       {
  42.         temp = NumOfSingle - count;

  43.         SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
  44.         WriteAddr +=  count;
  45.         pBuffer += count;

  46.         SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp);
  47.       }
  48.       else
  49.       {
  50.         SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
  51.       }
  52.     }
  53.     else /* NumByteToWrite > SPI_FLASH_PageSize */
  54.     {
  55.       NumByteToWrite -= count;
  56.       NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize;
  57.       NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;

  58.       SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
  59.       WriteAddr +=  count;
  60.       pBuffer += count;

  61.       while (NumOfPage--)
  62.       {
  63.         SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
  64.         WriteAddr +=  SPI_FLASH_PageSize;
  65.         pBuffer += SPI_FLASH_PageSize;
  66.       }

  67.       if (NumOfSingle != 0)
  68.       {
  69.         SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
  70.       }
  71.     }
  72.   }
  73. }

airwill 发表于 2014-2-25 17:26 | 显示全部楼层
spi 对于 W25Q16, SPI 是通用的, 其他芯片的代码也能用的

上传一份 coIde 下的 w25x 的驱动代码, 写得很规范, 不过更适合在 gccarm 下编译.
W25X.zip (9.41 KB, 下载次数: 55)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:读书喝茶,不争朝夕

141

主题

1431

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部