roby 发表于 2024-10-11 16:10:48

AI8051U SPI DMA使用请教

诸位大佬,

   AI8051U SPI DMA,读取和写入,配置是一样的,它是怎样识别自动写入 or 读取的,规格书反了几遍也没弄明白,哪位大佬指导下,感谢!
// 读取


void SPI_Read_Nbytes(u32 addr, u16 len)
{
//    u8i;
    if(len == 0)   return;
    if(!B_FlashOK)return;
    while(SpiDmaFlag);                     //DMA忙检测
    while(CheckFlashBusy() > 0);      //Flash忙检测

    SPI_CE_Low();                     //enable device
    SPI_WriteByte(SFC_READ);            //read command

    SPI_WriteByte(((u8 *)&addr));    //设置起始地址
    SPI_WriteByte(((u8 *)&addr));
    SPI_WriteByte(((u8 *)&addr));

    SpiDmaFlag = 1;
    DMA_SPI_AMT = (u8)(len-1);         //设置传输总字节数(低8位):n+1
    DMA_SPI_AMTH = (u8)((len-1) >> 8); //设置传输总字节数(高8位):n+1
    DMA_SPI_CR |= 0x40;   //开始SPI_DMA主模式操作
}

// 写入

void SPI_Write_Nbytes(u32 addr, u16 len)
{
    if(len == 0)   return;
    if(!B_FlashOK)return;
    while(SpiDmaFlag);                     //DMA忙检测
//    while(CheckFlashBusy() > 0);      //Flash忙检测

    FlashWriteEnable();               //使能Flash写命令

    SPI_CE_Low();                     // enable device
    SPI_WriteByte(SFC_PAGEPROG);      // 发送页编程命令
    SPI_WriteByte(((u8 *)&addr));    //设置起始地址
    SPI_WriteByte(((u8 *)&addr));
    SPI_WriteByte(((u8 *)&addr));

    SpiDmaFlag = 1;
    DMA_SPI_AMT = (u8)(len-1);         //设置传输总字节数(低8位):n+1
    DMA_SPI_AMTH = (u8)((len-1) >> 8); //设置传输总字节数(高8位):n+1
    DMA_SPI_CR |= 0x40;   //开始SPI_DMA主模式操作
}

乘风飞扬 发表于 2024-10-12 10:24:51

SPI的收发是同步执行的,主机模式MOSI在发送的同时,MISO也在读取。
发送完成的同时,读取也同样完成。
所以读取和写入,配置是一样的。

roby 发表于 2024-10-16 11:18:14

乘风飞扬 发表于 2024-10-12 10:24
SPI的收发是同步执行的,主机模式MOSI在发送的同时,MISO也在读取。
发送完成的同时,读取也同样完成。
所 ...

理解了,感谢!

wlhet 发表于 2024-11-4 08:22:26

学习了
页: [1]
查看完整版本: AI8051U SPI DMA使用请教