打印
[STM32L4]

读写不对

[复制链接]
877|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xxmmi|  楼主 | 2020-12-8 23:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;
        }
}

使用特权

评论回复
沙发
zhuhuis| | 2020-12-8 23:53 | 只看该作者
怎么个不对?

使用特权

评论回复
板凳
llljh| | 2020-12-8 23:56 | 只看该作者
能不能读取?

使用特权

评论回复
地板
kingkits| | 2020-12-9 08:33 | 只看该作者
写入是要按页写入的,如果没有重新输入页地址,则写入操作只在当前页里循环

使用特权

评论回复
5
yangxiaor520| | 2020-12-9 08:42 | 只看该作者
什么不对?

使用特权

评论回复
6
734774645| | 2020-12-9 15:36 | 只看该作者
这种没头没脑的问题,谁知道啥情况。

使用特权

评论回复
7
734774645| | 2020-12-9 15:39 | 只看该作者
不对就先找个对的,然后在怼的基础改嘛

使用特权

评论回复
8
llljh| | 2020-12-9 17:45 | 只看该作者
那你就把他修改对。

使用特权

评论回复
9
houcs| | 2020-12-9 17:49 | 只看该作者
串口打印下数据,看有没有输出

使用特权

评论回复
10
xxmmi|  楼主 | 2020-12-9 17:53 | 只看该作者
也可以用ST-Link单步调试

使用特权

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

使用特权

评论回复
12
wangzsa| | 2020-12-9 18:03 | 只看该作者
调试状态下看看寄存器

使用特权

评论回复
13
guoyt| | 2020-12-9 18:34 | 只看该作者
怎么个不对的现象啊

使用特权

评论回复
14
zwll| | 2020-12-9 18:38 | 只看该作者
大面上看不出来的 只能用示波器卡卡 看看修改一下延时时间啥的

使用特权

评论回复
15
houcs| | 2020-12-9 18:41 | 只看该作者
对不对,你自己不知道?

使用特权

评论回复
16
xxmmi|  楼主 | 2020-12-9 18:44 | 只看该作者

哦,那我就知道怎么回事了,多谢大家

使用特权

评论回复
17
nawu| | 2021-1-6 12:27 | 只看该作者
能详细说说现象吗

使用特权

评论回复
18
qcliu| | 2021-1-6 12:29 | 只看该作者
光看这段程序看不出来什么问题

使用特权

评论回复
19
tfqi| | 2021-1-6 12:53 | 只看该作者
读操作和写操作都不行吗

使用特权

评论回复
20
wiba| | 2021-1-6 12:55 | 只看该作者
单步运行可以吗

使用特权

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

本版积分规则

369

主题

4278

帖子

2

粉丝