打印
[STM32L4]

w25m02g读写不对,大家看看

[复制链接]
1596|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pegion1001|  楼主 | 2018-6-27 14:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
int main(void)
{
        uint16_t i = 0;
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_RTC_Init();
  MX_SPI1_Init();

User_W25Reset();
HAL_Delay(100);
User_W25WriteStaus(0xA0, 0x00);
User_W25BlockErase(0x00);
for(i = 0; i < 2048; i++)
{
        gUSER_SPI1_WriteBuffer[i] = 0xA0;
}
User_W25WriteData(0x00);
User_W25ReadPage(0x00);
  while (1)
  {       
        HAL_Delay(100);
        User_W25ReadStaus(0xC0);
  }

}

void User_W25Reset()
{
        uint8_t nData = 0xFF;
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_RESET);
        HAL_Delay(1);       
        HAL_SPI_Transmit(&hspi1, &nData, 1, 1000);       
        HAL_Delay(1);
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_SET);
}

void User_W25EnableORNo(uint8_t nEnable)
{
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_RESET);
        HAL_Delay(1);
        HAL_SPI_Transmit(&hspi1, &nEnable, 1, 1000);       
        HAL_Delay(1);
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_SET);
}

void User_W25ReadStaus(uint8_t naddr)
{
        uint8_t nData[9];
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_RESET);
        HAL_Delay(1);
        nData[0] = 0x05;
        nData[1] = naddr;
        HAL_SPI_Transmit(&hspi1, nData, 2, 1000);
        nData[0] = 0x00;
        nData[1] = 0x00;
  HAL_SPI_TransmitReceive(&hspi1, nData, gUSER_SPI1_ReadBuffer, 8,1000);
        HAL_Delay(1);
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_SET);
}

void User_W25WriteStaus(uint8_t naddr, uint8_t nCode)
{
        uint8_t nData[4];
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_RESET);
        HAL_Delay(1);
        nData[0] = 0x01;
        nData[1] = naddr;
        nData[2] = nCode;
          HAL_SPI_Transmit(&hspi1, nData, 3, 1000);
        HAL_Delay(1);
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_SET);
}

void User_W25BlockErase(uint16_t naddr)
{
        uint8_t nData[5];
        User_W25EnableORNo(0x06);
        while(1)
        {
                User_W25ReadStaus(0xC0);
                if((gUSER_SPI1_ReadBuffer[0] & 0x01) == 0)
                        break;
        }
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_RESET);
        HAL_Delay(1);
        nData[0] = 0xD8;
        nData[1] = 0x00;
        nData[2] = (naddr >> 8) & 0xFF;
        nData[3] = naddr & 0xFF;
        HAL_SPI_Transmit(&hspi1, nData, 4, 1000);
        HAL_Delay(1);
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_SET);
        while(1)
        {
                User_W25ReadStaus(0xC0);
                if((gUSER_SPI1_ReadBuffer[0] & 0x01) == 0)        //这里读回的数据是0x20,是不是就说明擦除正确完成了呢?
                        break;
        }
}

void User_W25ReadPage(uint8_t naddr)
{
        uint8_t nData[5];
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_RESET);
        HAL_Delay(1);
        nData[0] = 0x13;
        nData[1] = 0x00;
        nData[2] = (naddr >> 8) & 0xFF;
        nData[3] = naddr & 0xFF;
        HAL_SPI_Transmit(&hspi1, nData, 4, 1000);
        User_W25ReadStaus(0xC0);
        while(1)
        {
                User_W25ReadStaus(0xC0);
                if((gUSER_SPI1_ReadBuffer[0] & 0x01) == 0)//这里返回的是0x20;
                        break;
        }
        nData[0] = 0x0B;
        nData[1] = 0x00;       
        nData[2] = 0x00;
        nData[3] = 0x00;
        HAL_SPI_Transmit(&hspi1, nData, 4, 1000);

        HAL_SPI_TransmitReceive(&hspi1, gUSER_SPI1_WriteBuffer, gUSER_SPI1_ReadBuffer, 2112,1000);//这里返回的数据都是0x00;
        HAL_Delay(1);
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_SET);
}

void User_W25WriteData(uint16_t naddr)
{
        uint8_t nData[5];
        User_W25EnableORNo(0x06);

        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_RESET);
        HAL_Delay(1);
        nData[0] = 0x02;
        nData[1] = 0x00;
        nData[2] = 0x00;
        HAL_SPI_Transmit(&hspi1, nData, 3, 1000);
        HAL_SPI_Transmit(&hspi1, gUSER_SPI1_WriteBuffer, 2048, 1000);
       
        nData[0] = 0x10;
        nData[1] = 0x00;       
        nData[2] = (naddr >> 8) & 0xFF;
        nData[3] = naddr & 0xFF;
        HAL_SPI_Transmit(&hspi1, nData, 4, 1000);
       
       
        HAL_Delay(1);
        HAL_GPIO_WritePin(W25_CS_GPIO_Port, W25_CS_Pin, GPIO_PIN_SET);
        while(1)
        {
                User_W25ReadStaus(0xC0);
                if((gUSER_SPI1_ReadBuffer[0] & 0x01) == 0)        //这里返回的数据是22
                        break;
        }
}
沙发
Varus| | 2018-6-29 21:17 | 只看该作者
怎么个不对?能不能读取?读取结果是多少?

使用特权

评论回复
板凳
捉虫天师| | 2018-7-2 18:57 | 只看该作者
那你就把他修改对。

使用特权

评论回复
地板
aizaixiyuanqian| | 2018-7-2 21:47 | 只看该作者
串口打印下数据,看有没有输出

使用特权

评论回复
5
aizaixiyuanqian| | 2018-7-2 21:48 | 只看该作者
也可以用ST-Link单步调试

使用特权

评论回复
6
nighstar| | 2018-7-17 18:07 | 只看该作者
关注一下status register 2里的BUF标志,BUF=1和BUF=0,对应的读指令是不同的。。芯片型号的最后一位是G或T,对应的BUF默认值不同

使用特权

评论回复
7
磨砂| | 2018-7-17 21:24 | 只看该作者
调试状态下看看寄存器

使用特权

评论回复
8
wowu| | 2018-7-21 09:21 | 只看该作者
怎么个不对的现象啊

使用特权

评论回复
9
晓伍| | 2018-7-23 08:49 | 只看该作者
大面上看不出来的 只能用示波器卡卡 看看修改一下延时时间啥的

使用特权

评论回复
10
小明的同学| | 2019-2-24 10:17 | 只看该作者
对不对,你自己不知道?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

168

帖子

0

粉丝