找回密码
 立即注册
楼主: tzz1983

文件系统 FATFS@AI8051U,通用 FAT/exFAT

  [复制链接]

6

主题

49

回帖

178

积分

注册会员

积分
178
发表于 2026-4-22 15:25:15 | 显示全部楼层
不错
那不是摊上有一个大虾读取MP3文件播放语音,那不就是MP3了
^_^
高手太多了!
回复

使用道具 举报 送花

54

主题

397

回帖

856

积分

高级会员

积分
856
发表于 2026-8-15 18:16:01 | 显示全部楼层
我的AI8051实验箱版本 V1.2  2024-9-20的.
截图202608151851059720.jpg
回复

使用道具 举报 送花

54

主题

397

回帖

856

积分

高级会员

积分
856
发表于 2026-8-15 19:13:21 | 显示全部楼层
STC32G12K128 实验箱9.62  2023-5-19
上串口2 的效果,这个是可以的。
截图202608151914584676.jpg


截图202608151912335560.jpg

回复

使用道具 举报 送花

1

主题

122

回帖

1467

积分

金牌会员

积分
1467
发表于 2026-8-15 21:44:05 | 显示全部楼层
这个AI-Cube有吗?
回复

使用道具 举报 送花

已绑定手机

82

主题

218

回帖

694

积分

高级会员

积分
694
发表于 2026-8-16 06:13:18 | 显示全部楼层
可以,我试试
回复

使用道具 举报 送花

54

主题

397

回帖

856

积分

高级会员

积分
856
发表于 2026-8-20 08:48:05 | 显示全部楼层
tzz1*** 发表于 2024-9-2 21:35
电脑通过文件和 MCU 实时通信
桌面上什么驱动都不用!
点一下保存文件,数据就传到MCU了!

/*---------------------------------------------------------
spi.c
----------------------------------------------------------*/


#include "spi.h"
#include "STC32G.h"

static u8  DmaSpiSta=0;
static bit DmaFlag = 0;

#define        GPIO_Pin_2                0x04        //IO引脚 Px.2
#define        GPIO_Pin_3                0x08        //IO引脚 Px.3
#define        GPIO_Pin_4                0x10        //IO引脚 Px.4
#define        GPIO_Pin_5                0x20        //IO引脚 Px.5

#define  P2_MODE_OUT_PP(Pin)                        {P2M1 &= ~(Pin), P2M0 |= (Pin);}
#define  P2_MODE_IO_PU(Pin)                                {P2M1 &= ~(Pin), P2M0 &= ~(Pin);}

#define        SPI_P22_P23_P24_P25                1
#define  SPI_SW(Pin)                                P_SW1 = (P_SW1 & 0xF3) | (Pin << 2)
/*---------------------------------------------------------
SPI_DMA_Read
----------------------------------------------------------*/
u8 SPI_DMA_Read(u8 *buf, u16 len)
{
    u8 perr;
   
    DMA_SPI_CFG  = 0xAF;            //允许中断,最高优先级,允许接收
    DMA_SPI_RXAH = (u16)buf >> 8;   //SPI接收数据存储地址
    DMA_SPI_RXAL = (u16)buf;
   
    len--;
    DMA_SPI_AMTH = len>>8;  //设置传输总字节数:n+1
    DMA_SPI_AMT  = len;     //设置传输总字节数:n+1
   
    DmaFlag = 1;            //设置查询标志,中断里清零
    DMA_SPI_CR |= 0x40;     //开始SPI_DMA主模式操作
   
    // xie OSMboxPend (SpiDmaSignal,0,&perr);
    while(DmaFlag);
   
    return DmaSpiSta;
}

/*---------------------------------------------------------
SPI_DMA_Write
----------------------------------------------------------*/
u8 SPI_DMA_Write(u8 *buf, u16 len)
{
    u8 perr;

    DMA_SPI_CFG  = 0xCF;            //允许中断,最高优先级,允许发送
    DMA_SPI_TXAH = (u16)buf >> 8;   //SPI发送数据存储地址
    DMA_SPI_TXAL = (u16)buf;
   
    len--;
    DMA_SPI_AMTH = len>>8;  //设置传输总字节数:n+1
    DMA_SPI_AMT  = len;     //设置传输总字节数:n+1
   
    DmaFlag = 1;            //设置查询标志,中断里清零
    DMA_SPI_CR |= 0x40;     //开始SPI_DMA主模式操作
   
    // xie OSMboxPend (SpiDmaSignal,0,&perr);
    while(DmaFlag);
   
    return DmaSpiSta;
}


/*---------------------------------------------------------
SPI_DMA_Interrupt
----------------------------------------------------------*/
void SPI_DMA_ISR_Handler (void) interrupt DMA_SPI_VECTOR
// void DMA_SPI_ISR_Handler_Hook (void)        // 49
{
    DmaSpiSta = DMA_SPI_STA&0x06;
    DMA_SPI_STA = 0;
    DmaFlag = 0;
    // xie OSMboxPost(SpiDmaSignal,(void*)1);
}


/*---------------------------------------------------------
SPI_shift
----------------------------------------------------------*/
u8 SPI_DMA_Shift(u8 dat)
{
    SPSTAT = 0XFF;
    SPDAT = dat;
    while (!SPIF);
    return SPDAT;
}


/*---------------------------------------------------------
SPI_DMA_Config
----------------------------------------------------------*/
void SPI_DMA_Config(void)
{
    HSCLKDIV = 0X01;
   
    HSSPI_CFG  = 0X11;
    HSSPI_CFG2 = 0X21;
   
    DMA_SPI_STA = 0x00;
    DMA_SPI_CFG = 0xEF;
   
    DMA_SPI_CFG2 = 0x00;
    DMA_SPI_CR   = 0x81;
}


/*---------------------------------------------------------
SPI_init
----------------------------------------------------------*/
void SPI_DMA_Init( void )
{
    SPI_DMA_Config();
   
    P2_MODE_OUT_PP(GPIO_Pin_2);     //SPI_CS
    P2_MODE_OUT_PP(GPIO_Pin_3);     //SPI_MOSI
    P2_MODE_IO_PU (GPIO_Pin_4);     //SPI_MISO
    P2_MODE_OUT_PP(GPIO_Pin_5);     //SPI_CLK
    SPI_SW(SPI_P22_P23_P24_P25);    //选择IO
/*   
    P4_MODE_OUT_PP(GPIO_Pin_7);     //IO_25Q32_CS
    P1_MODE_OUT_PP(GPIO_Pin_3);     //IO_25Q32_MOSI
    P1_MODE_IO_PU (GPIO_Pin_4);     //IO_25Q32_MISO
    P1_MODE_OUT_PP(GPIO_Pin_5);     //IO_25Q32_CLK
    SPI_SW(SPI_P54_P13_P14_P15);    //选择IO
*/
    SPI_CS = 1;
    SPCTL = 0xD3;
    SPSTAT = 0XFF;
}


  这个是  本楼主  msc fatfs ucos2 综合.rar (773.19 KB, 下载次数: 409)   中的SPI 代码。 这个代码中  同时使用了 两种模式? 一种是普通的spi,一种是hsspi?


void flash_init()
{
    dwMemorySize = W25QXX_INIT();
    wSectorSize = 512;
    dwSectorNumber = dwMemorySize / wSectorSize;
    fFlashOK = dwMemorySize>0;
}
u32 W25QXX_INIT(void)
{
    u32 MemorySize;
   
    if ( FlashOK ) return W25QXX_Get_MemorySize();
        
    SPI_DMA_Init();
   
    MemorySize = W25QXX_Get_MemorySize();
   
    if( MemorySize ) {
        FlashOK = 1;
        Cache_addr=0;                               //当前缓存对应的扇区
        Cache_Flag=0;                               //0表示缓存内没有未写入的数据
        Read_Flash(Cache_addr,CacheBufS,4096);      //填充缓存
    }
   
    return MemorySize;
}

u8 W25QXX_Get_ID(void)
{
    u8 a;
    SPI_CS=0;
    SPI_DMA_Shift(SFC_RDID);
    SPI_DMA_Shift(0);
    SPI_DMA_Shift(0);
    SPI_DMA_Shift(0);
    a=SPI_DMA_Shift(0);   // 我像把楼主这个代码从 这个工程里挪出来,结果挪出来后,调用完,我发现这里返回的是 0   
    SPI_CS=1;
    return a;
}

/*---------------------------------------------------------
返回 MemorySize
----------------------------------------------------------*/
u32 W25QXX_Get_MemorySize(void)
{
    u8 id, jid;
   
    id = W25QXX_Get_ID();
   
    if ( (id<0x10) || (id>0x17) )
        {
                return 0;  //限制 128KB 至 16MB 之间的型号有效
        }
        
    SPI_CS=0;
    SPI_DMA_Shift(SFC_RDJID);
    SPI_DMA_Shift(0);
    SPI_DMA_Shift(0);
    jid=SPI_DMA_Shift(0);
    SPI_CS=1;
   
    if ( jid != (id+1) ) {
                return 0;          //JID 总是比 ID 大1
    }
    return 1ul << jid;
}

点评

没有用hsspi, 就只有普通的SPI, 你看到的访问方式确实有两种,一种是直接用SPI访问,这是访问少数几个节节或发送命令和地址时,不用DMA更方便, 在传输批量数据时用DMA_SPI, 这两种方式可以共存,不开DMA时,SPI还  详情 回复 发表于 2026-8-20 09:04
回复

使用道具 举报 送花

37

主题

1172

回帖

3078

积分

荣誉版主

积分
3078
 楼主| 发表于 2026-8-20 09:04:43 | 显示全部楼层
xie2*** 发表于 2026-8-20 08:48
/*---------------------------------------------------------
spi.c
-------------------------------- ...

没有用hsspi, 就只有普通的SPI,
你看到的访问方式确实有两种,一种是直接用SPI访问,这是访问少数几个字节或发送命令和地址字节时,不用DMA更方便,
在传输批量数据时用DMA_SPI,
这两种方式可以共存,不用DMA时,SPI还是SPI, 直接用就行
回复

使用道具 举报 送花

54

主题

397

回帖

856

积分

高级会员

积分
856
发表于 2026-8-22 13:56:39 | 显示全部楼层
大佬,你一楼传的ai8051 的代码应该是搞错了吧。

里面的SPI_init  引脚都不对吧。 如果引脚没写错,那就是stc32g的,不是ai8051的。

void SPI_init( void )
{
    SPI_DMA_Config();
   
    P2_MODE_OUT_PP(GPIO_Pin_2);     //SPI_CS
    P2_MODE_OUT_PP(GPIO_Pin_3);     //SPI_MOSI
    P2_MODE_IN_HIZ (GPIO_Pin_4);     //SPI_MISO
    P2_MODE_OUT_PP(GPIO_Pin_5);     //SPI_CLK

    SPI_SW(SPI_P22_P23_P24_P25);    //选择IO

截图202608221353196409.jpg

点评

[attachimg]147889[/attachimg]  详情 回复 发表于 2026-8-22 17:05
回复

使用道具 举报 送花

37

主题

1172

回帖

3078

积分

荣誉版主

积分
3078
 楼主| 发表于 2026-8-22 17:05:49 | 显示全部楼层
xie2*** 发表于 2026-8-22 13:56
大佬,你一楼传的ai8051 的代码应该是搞错了吧。

里面的SPI_init  引脚都不对吧。 如果引脚没写错,那就是 ...

截图202608221705381827.jpg
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-9-19 22:56 , Processed in 0.078006 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表