| 
 
| 软件模拟SPI 读写flash W25Q16 mode 0 3 可以正确读写;mode2似乎也可以: 
 main.c 代码如下;
 #include &quot;stm32f10x.h&quot;   // 相当于51单片机中的  #include <reg51.h>
 //#include &quot;bsp_led.h&quot;
 #include &quot;bsp_usart.h&quot;
 #include &quot;bsp_systick.h&quot;
 //#include &quot;cycle_queue.h&quot;
 #include &quot;bsp_spi_soft_flash.h&quot;
 #include &quot;stdio.h&quot;
 
 typedef enum { FAILED = 0, PASSED = !FAILED} TestStatus;
 
 /* 获取缓冲区的长度 */
 #define TxBufferSize1   (countof(TxBuffer1) - 1)
 #define RxBufferSize1   (countof(TxBuffer1) - 1)
 #define countof(a)      (sizeof(a) / sizeof(*(a)))
 #define  BufferSize (countof(Tx_Buffer)-1)
 
 #define  FLASH_WriteAddress     0x000000
 #define  FLASH_ReadAddress      FLASH_WriteAddress
 #define  FLASH_SectorToErase    FLASH_WriteAddress
 
 
 /* 发送缓冲区初始化 */
 //uint8_t Tx_Buffer[] = &quot;感谢您选用秉火stm32开发板\r\n&quot;;
 
 
 //  NUM : 100
 //uint8_t Tx_Buffer[] = &quot;abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRST\r\n&quot;;
 
 //  NUM : 127
 //uint8_t Tx_Buffer[] = &quot;abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu\r\n&quot;;
 
 
 //  NUM : 128
 //uint8_t Tx_Buffer[] = &quot;abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv\r\n&quot;;
 
 
 //  NUM : 255
 //uint8_t Tx_Buffer[] = &quot;abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRS\r\n&quot;;
 
 //  NUM : 256
 //uint8_t Tx_Buffer[] = &quot;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRST\r\n&quot;;
 
 // NUM : 258
 //uint8_t Tx_Buffer[] = &quot;abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUV\r\n&quot;;
 
 // NUM : 514
 uint8_t Tx_Buffer[] = &quot;abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVabcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUV\r\n&quot;;
 
 //uint8_t Tx_Buffer[] = &quot;\
 //零一二三四五六七**十百千万亿兆\
 //零一二三四五六七**十百千万亿兆\
 //\r\n&quot;;
 #if 0              //  write 4096 BYTE include /r/n
 uint8_t Tx_Buffer[] = &quot;\
 我有一个梦想我没有梦想\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿兆\
 零一二三四五六七**十百千万亿\
 \r\n&quot;;
 #endif
 uint8_t Rx_Buffer[5000];
 
 __IO uint32_t DeviceID = 0;
 __IO uint32_t FlashID = 0;
 __IO TestStatus TransferStatus1 = FAILED;
 
 // 函数原型声明
 void Delay(__IO uint32_t nCount);
 TestStatus Buffercmp(uint8_t* pBuffer1,uint8_t* pBuffer2, uint16_t BufferLength);
 
 
 extern uint8_t Usart_data_Test[] = &quot;0123abc&quot;;
 
 int main(void)
 {
 uint16_t i;
 uint8_t Udata[30] = &quot;012345678a&quot;;
 USART1_GPIO_Config();
 
 Dms(1000);
 USART_Send_String(USART1, Udata);
 printf(&quot;\n 2Mbyte SPI flash W25Q16 实验 \n&quot;);
 
 /* 2M串行flash W25Q16初始化 */
 SPI_soft_FLASH_Init();
 
 /* 获取 Flash Device ID */
 DeviceID = SPI_soft_FLASH_ReadDeviceID();
 Delay( 200 );
 /* 获取 SPI Flash ID */
 FlashID = SPI_soft_FLASH_ReadID();
 printf(&quot;\n FlashID is 0x%X,        Manufacturer Device ID is 0x%X\n&quot;, FlashID, DeviceID);
 
 /* 检验 SPI Flash ID */
 if (FlashID == sFLASH_ID)
 {
 printf(&quot;\n found flash W25Q16 !\n&quot;);
 
 /* 擦除将要写入的 SPI FLASH 扇区,FLASH写入前要先擦除 */
 // 这里擦除4K,即一个扇区,擦除的最小单位是扇区
 //SPI_FLASH_SectorErase(FLASH_SectorToErase);
 SPI_soft_FLASH_SectorErase(0x000000);        // sector 0
 SPI_soft_FLASH_SectorErase(0x001000);        // sector 1
 //                SPI_FLASH_BulkErase();
 //                SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);
 //                printf(&quot;\n read data from flash!\n&quot;);
 //                printf(&quot;  %s  \n&quot;, Rx_Buffer);
 
 //                SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, 4096);
 //                for(i=0;i<4096;i++)
 //                printf(&quot;num = %d 擦除后的扇区数据为:%d\n&quot;,i,Rx_Buffer);
 //
 /* 将发送缓冲区的数据写到flash中 */
 // 这里写一页,一页的大小为256个字节
 #if 1
 SPI_soft_FLASH_BufferWrite(Tx_Buffer, 0x000ff8,BufferSize);
 printf(&quot;\n 写入的数据长度为:%d\n&quot;, BufferSize);
 //                printf(&quot;\n  写入的数据为: %s\n&quot;, Tx_Buffer);
 
 /* 将刚刚写入的数据读出来放到接收缓冲区中 */
 SPI_soft_FLASH_BufferRead(Rx_Buffer, 0x000ff8,BufferSize);
 //                printf(&quot;\n read data from flash!\n&quot;);/*  flash!后面只有一个空格时(或者是奇数个空格,这个情况应该是和汉字编码有关,汉字编码一个汉字占2个字节)
 //                后面答应的Rx_Buffer会出现乱码;前后空格的原因导致乱码; */
 //                printf(&quot;  %s  \n&quot;, Rx_Buffer);
 for(i=0;i<BufferSize;i++)
 printf(&quot;num =%4d->%.2c  &quot;,i,Tx_Buffer);
 printf(&quot;\n&quot;);
 for(i=0;i<BufferSize;i++)
 printf(&quot;num =%4d->%.2c  &quot;,i,Rx_Buffer);
 printf(&quot;\n&quot;);
 //                                SPI_FLASH_BufferRead(Rx_Buffer, 0x000000,1024);
 //                                SPI_FLASH_BufferFastRead(Rx_Buffer, 0x000000, 1024);
 //                                                for(i=0;i<1024;i++)
 //                                                printf(&quot;num =%4d->%.2c  &quot;,i,Rx_Buffer);
 #endif
 //                USART_Send_String(USART1,&quot;\n read data from flash!\n&quot;);
 //                printf(&quot;\n 读出的数据为:\n&quot;);
 
 //                printf(&quot;\r\n er读出的数据为:\r\n&quot;);
 //                USART_Send_String(USART1,Rx_Buffer);
 /* 检查写入的数据与读出的数据是否相等 */
 TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);
 
 if( PASSED == TransferStatus1 )
 {
 printf(&quot;\n 2M spi soft flash W25Q16  测试成功!\n&quot;);
 }
 else
 {
 printf(&quot;\n 2M spi soft flash W25Q16  测试失败!\n&quot;);
 }
 
 
 //                SPI_soft_FLASH_BufferRead(Rx_Buffer, 0x000ff8,1024);
 //                for(i=0;i<1024;i++)
 //                printf(&quot;num =%4d->%.2c  &quot;,i,Rx_Buffer);
 
 
 }// if (FlashID == sFLASH_ID)
 else// if (FlashID == sFLASH_ID)
 {
 printf(&quot;\n connot found W25Q16 ID!\n&quot;);
 }
 
 
 
 while(1)
 {
 Dms(20000);
 printf(&quot;  hello \n&quot;);
 }
 }
 
 
 
 /*
 * 函数名:Buffercmp
 * 描述  :比较两个缓冲区中的数据是否相等
 * 输入  :-pBuffer1     src缓冲区指针
 *         -pBuffer2     dst缓冲区指针
 *         -BufferLength 缓冲区长度
 * 输出  :无
 * 返回  :-PASSED pBuffer1 等于   pBuffer2
 *         -FAILED pBuffer1 不同于 pBuffer2
 */
 TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
 {
 while(BufferLength--)
 {
 if(*pBuffer1 != *pBuffer2)
 {
 return FAILED;
 }
 
 pBuffer1++;
 pBuffer2++;
 }
 return PASSED;
 }
 
 void Delay(__IO uint32_t nCount)
 {
 for(; nCount != 0; nCount--);
 }
 /*********************************************END OF FILE**********************/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 spi_soft_flash.rar
 
 
 
 2018-10-16 22:05 上传
 点击文件名下载附件
 | 
 |