大佬们,急问

[复制链接]
10599|7
 楼主| guiguihhh 发表于 2022-3-8 17:22 | 显示全部楼层 |阅读模式
本帖最后由 tyw 于 2022-3-9 12:39 编辑

我用了新唐M4系列的主控,然后用SPI1想和SPI Flash通信,结果写入和读出的数据不准确,是什么原因。以下是我使用的代码
// *****************************************************************************
// 函数名称: void  SPI_Flash_Send_Add(uint32_t  Address)
// 函数功能: 向SPI Flash发送地址
// 入口参数:
// 出口参数:
// 说    明:
// *****************************************************************************
void  SPI_Flash_Send_Add(uint32_t  Address)
{
    SPI_WRITE_TX(SPI1,(Address>>16)&0xff);
    SPI_WRITE_TX(SPI1,(Address>>8)&0xff);   
    SPI_WRITE_TX(SPI1,Address);
    /* Wait ready */
    while(SPI_IS_BUSY(SPI1));
}








// *****************************************************************************
// 函数名称: uint8_t  SPI_Flash_Read_Data(uint8_t  *pRamAddress,  uint16_t  cnt)
// 函数功能: 从SPI Flash中读取数据到指定地址的Ram区域
// 入口参数: cnt不能超过SPI传输的最大值!!
// 出口参数:
// 说    明:
// *****************************************************************************
void  SPI_Flash_Read_Buff(uint32_t  Address,  uint8_t  *pRamAddress,  uint16_t  cnt)
{
    //  Send the read slow command
    SPI_SET_SS_LOW(SPI1);
    SPI_WRITE_TX(SPI1,SPIFLH_CMD_READSLOW);


    /* Wait ready */
    while(SPI_IS_BUSY(SPI1));

    //  Send the address
    SPI_Flash_Send_Add(Address);

    //  Read number of bytes
    while(cnt)
    {
        //8位,读的好像是32位???
        SPI_WRITE_TX(SPI1,Dummy_Byte);
        *pRamAddress++ = SPI_READ_RX(SPI1);                             // 读SPI DATA IN 数据

        /* Wait ready */
        //while(SPI_IS_BUSY(SPI1));
        cnt--;
    }
    SPI_SET_SS_HIGH(SPI1);

}   



// *****************************************************************************
// 函数名称: uint8_t  SPI_Flash_Write_Buff
// 函数功能: 将BUFF中的数据写入到SPI Flash的指定地址
// 入口参数:
// 出口参数:
// 说    明:
// *****************************************************************************
void SPI_Flash_Write_Buff(uint32_t  Address,  uint8_t  *pRamAddress,  uint16_t  cnt)
{
    while(cnt)
    {
        //  Send a write enable command
        SPI_SET_SS_LOW(SPI1);
        SPI_WRITE_TX(SPI1,SPIFLH_CMD_WREN);
        while(SPI_IS_BUSY(SPI1));
        SPI_SET_SS_HIGH(SPI1);  


        //  Send a page program command
        SPI_SET_SS_LOW(SPI1);   
        SPI_WRITE_TX(SPI1,SPIFLH_CMD_PROGRAM);
        while(SPI_IS_BUSY(SPI1));


        //  Send the address
        SPI_Flash_Send_Add(Address);

        //  Send at least one byte
        SPI_WRITE_TX(SPI1,*pRamAddress++);
        while(SPI_IS_BUSY(SPI1));
        //  Increment
        Address++;
        cnt--;
        //  Send bytes until we get to the end of a page
        while ((cnt > 0) && ((Address&0x0000ff) != 0))
        {
            SPI_WRITE_TX(SPI1,*pRamAddress++);
            while(SPI_IS_BUSY(SPI1));
            Address++;
            cnt--;
        }
        //  Deselect the chip
        SPI_SET_SS_HIGH(SPI1);
        //  Poll status until the write completes
        SPI_Flash_Read_Status();
    }
}





uint8_t SPI_Flash_Erase_Sector(uint32_t Address)
{        
    uint8_t Status;   
    SPI_SET_SS_LOW(SPI1);
    SPI_WRITE_TX(SPI1,SPIFLH_CMD_WREN);
    while(SPI_IS_BUSY(SPI1));
    SPI_SET_SS_HIGH(SPI1);

    SPI_SET_SS_LOW(SPI1);
    SPI_WRITE_TX(SPI1,SPIFLH_CMD_SECTORERASE);
    while(SPI_IS_BUSY(SPI1));


    SPI_Flash_Send_Add(Address);


    SPI_SET_SS_HIGH(SPI1);
    Status = SPI_Flash_Read_Status();
    return Status;
}



uint8_t SPI_Flash_Read_Status(void)
{
    uint8_t MEMSTAT;
    do
    {
        SPI_SET_SS_LOW(SPI1);
        SPI_WRITE_TX(SPI1,SPIFLH_CMD_RDSR);
        //while(SPI_IS_BUSY(SPI1));
        MEMSTAT = SPI_READ_RX(SPI1);
        //while(SPI_IS_BUSY(SPI1));
        SPI_SET_SS_HIGH(SPI1);
    } while (MEMSTAT&0x01);
    return MEMSTAT;
}


int main()
{        SPI1_Init();

    SPI_Flash_Read_Buff(0x00,puint8_tRxBuf,sizeof(puint8_tRxBuf));
    SPI_Flash_Erase_Sector(0x00);
    SPI_Flash_Read_Buff(0x00,puint8_tRxBuf,sizeof(puint8_tRxBuf));
    SPI_Flash_Write_Buff(0x00,puint8_tTxBuf,sizeof(puint8_tTxBuf));
    SPI_Flash_Read_Buff(0x00,puint8_tRxBuf,sizeof(puint8_tRxBuf));
while(1);


}


ningling_21 发表于 2022-3-8 19:13 | 显示全部楼层
先确认硬件没问题
呐咯密密 发表于 2022-3-9 09:29 | 显示全部楼层

大佬们,急问

能好好整理一下吗,看的眼花搜索
复制

评论

不好意思哈,第一次发帖没有太注意  发表于 2022-3-10 16:54
lvyunhua 发表于 2022-3-9 10:59 | 显示全部楼层
用示波器看下波形
海洋无限 发表于 2022-3-9 12:12 | 显示全部楼层
电路也需要检查下
 楼主| guiguihhh 发表于 2022-3-10 17:15 | 显示全部楼层
解决了大佬们,原因是发送一个字节同时要把RX寄存器中的值读走,不然会一直积在里面
资深技术 发表于 2022-3-10 18:13 | 显示全部楼层
官网有这个例程
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

9

帖子

0

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