问答

汇集网友智慧,解决技术难题

21ic问答首页 - 大佬们,急问

新唐 M4 spi flash

大佬们,急问

guiguihhh2022-03-08
本帖最后由 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);


}


回答 +关注 6
9987人浏览 6人回答问题 分享 举报
6 个回答

您需要登录后才可以回复 登录 | 注册