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

【Ai8051U】擎天柱核心板学习记录贴 | 已有部分开源程序发布

 火.. [复制链接]
已绑定手机

0

主题

2

回帖

10

积分

新手上路

积分
10
发表于 2026-7-10 05:08:27 | 显示全部楼层
erci*** 发表于 2026-7-9 08:43
【免费 + 包邮 送】及 如何【扫码 小量购买】 单片机/烧录器/开发工具 - 其他技术交流 国芯人工智能技术 ...

Thank you
回复

使用道具 举报 送花

0

主题

5

回帖

24

积分

新手上路

积分
24
发表于 2026-7-12 22:03:33 来自手机 | 显示全部楼层
怎么送的

点评

【免费 + 包邮 送】及 如何【扫码 小量购买】 单片机/烧录器/开发工具 - 其他技术交流 国芯人工智能技术交流网站 - AI32位8051交流社区  详情 回复 发表于 2026-7-13 08:52
回复

使用道具 举报 送花

已绑定手机

124

主题

5136

回帖

1万

积分

超级版主

无情的代码机器

积分
11480
 楼主| 发表于 2026-7-13 08:52:47 | 显示全部楼层
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

已绑定手机

6

主题

497

回帖

2554

积分

金牌会员

积分
2554
发表于 2026-7-14 21:48:24 | 显示全部楼层
很好
学习
回复

使用道具 举报 送花

已绑定手机

0

主题

3

回帖

8

积分

新手上路

积分
8
发表于 2026-8-10 12:45:43 来自手机 | 显示全部楼层
刚注册还有送的啊?

点评

[attachimg]146581[/attachimg]  详情 回复 发表于 2026-8-10 13:55
回复

使用道具 举报 送花

已绑定手机

124

主题

5136

回帖

1万

积分

超级版主

无情的代码机器

积分
11480
 楼主| 发表于 2026-8-10 13:55:41 | 显示全部楼层
kin*** 发表于 2026-8-10 12:45
刚注册还有送的啊?

截图202608101355315938.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

已绑定手机

6

主题

497

回帖

2554

积分

金牌会员

积分
2554
发表于 2026-8-13 20:04:44 | 显示全部楼层
还有送么?
学习
回复

使用道具 举报 送花

57

主题

395

回帖

497

积分

中级会员

积分
497
发表于 2026-8-21 09:29:15 | 显示全部楼层
截图202608210925504060.jpg


使用了楼主的 《qtz\22.-MSC_Mass_Storage_Class_协议范例\keilC251\list》 第一次格式化时,提示无法格式化,不过实际上u盘显示出来了。然后创建文件时,就报如上错误。

回复

使用道具 举报 送花

57

主题

395

回帖

497

积分

中级会员

积分
497
发表于 2026-8-21 09:38:42 | 显示全部楼层
#define     IAP_STANDBY()   IAP_CMD = 0     //IAP空闲命令(禁止)
#define     IAP_READ()      IAP_CMD = 1     //IAP读出命令
#define     IAP_WRITE()     IAP_CMD = 2     //IAP写入命令
#define     IAP_ERASE()     IAP_CMD = 3     //IAP擦除命令

#define     IAP_ENABLE()    IAP_CONTR = IAP_EN; IAP_TPS = FOSC / 1000000
#define     IAP_DISABLE()   IAP_CONTR = 0; IAP_CMD = 0; IAP_TRIG = 0; IAP_ADDRE = 0xff; IAP_ADDRH = 0xff; IAP_ADDRL = 0xff

#define IAP_EN          (1<<7)
#define IAP_SWBS        (1<<6)
#define IAP_SWRST       (1<<5)
#define IAP_CMD_FAIL    (1<<4)


//========================================================================
// 函数: void DisableEEPROM(void)
// 描述: 禁止EEPROM.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2014-6-30
//========================================================================
void DisableEEPROM(void)        //禁止访问EEPROM
{
    IAP_CONTR = 0;          //关闭 IAP 功能
    IAP_CMD = 0;            //清除命令寄存器
    IAP_TRIG = 0;           //清除触发寄存器
    IAP_ADDRE = 0xff;       //将地址设置到非 IAP 区域
    IAP_ADDRH = 0xff;       //将地址设置到非 IAP 区域
    IAP_ADDRL = 0xff;
}

//========================================================================
// 函数: void EEPROM_Trig(void)
// 描述: 触发EEPROM操作.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2014-6-30
//========================================================================
void EEPROM_Trig(void)
{
    F0 = EA;    //保存全局中断
    EA = 0;     //禁止中断, 避免触发命令无效
    IAP_TRIG = 0x5A;
    IAP_TRIG = 0xA5;    //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
                        //送完A5H后,IAP命令立即被触发启动
                        //CPU等待IAP完成后,才会继续执行程序。
    _nop_();   //多级流水线的指令系统,触发命令后建议加4个NOP,保证IAP_DATA的数据完成准备
    _nop_();
    _nop_();
    _nop_();
    EA = F0;    //恢复全局中断
}

//========================================================================
// 函数: void EEPROM_SectorErase(u32 EE_address)
// 描述: 擦除一个扇区.
// 参数: EE_address:  要擦除的EEPROM的扇区中的一个字节地址.
// 返回: none.
// 版本: V1.0, 2014-6-30
//========================================================================
void EEPROM_SectorErase(u32 EE_address)
{
    IAP_ENABLE();                       //设置等待时间,允许IAP操作,送一次就够
    IAP_ERASE();                        //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
                                        //只有扇区擦除,没有字节擦除,512字节/扇区。
                                        //扇区中任意一个字节地址都是扇区地址。
    IAP_ADDRE = (u8)(EE_address >> 16); //送扇区地址高字节(地址需要改变时才需重新送地址)
    IAP_ADDRH = (u8)(EE_address >> 8);  //送扇区地址中字节(地址需要改变时才需重新送地址)
    IAP_ADDRL = (u8)EE_address;         //送扇区地址低字节(地址需要改变时才需重新送地址)
    EEPROM_Trig();                      //触发EEPROM操作
    DisableEEPROM();                    //禁止EEPROM操作
}

//========================================================================
// 函数: void EEPROM_read_n(u32 EE_address,u8 *DataAddress,u8 lenth)
// 描述: 读N个字节函数.
// 参数: EE_address:  要读出的EEPROM的首地址.
//       DataAddress: 要读出数据的指针.
//       length:      要读出的长度
// 返回: 0: 写入正确.  1: 写入长度为0错误.  2: 写入数据错误.
// 版本: V1.0, 2014-6-30
//========================================================================
void EEPROM_read_n(u32 EE_address,u8 *DataAddress,u16 length)
{
    IAP_ENABLE();                           //设置等待时间,允许IAP操作,送一次就够
    IAP_READ();                             //送字节读命令,命令不需改变时,不需重新送命令
    do
    {
        IAP_ADDRE = (u8)(EE_address >> 16); //送地址高字节(地址需要改变时才需重新送地址)
        IAP_ADDRH = (u8)(EE_address >> 8);  //送地址中字节(地址需要改变时才需重新送地址)
        IAP_ADDRL = (u8)EE_address;         //送地址低字节(地址需要改变时才需重新送地址)
        EEPROM_Trig();                      //触发EEPROM操作
        *DataAddress = IAP_DATA;            //读出的数据送往
        EE_address++;
        DataAddress++;
    }while(--length);

    DisableEEPROM();
}


//========================================================================
// 函数: u8 EEPROM_write_n(u32 EE_address,u8 *DataAddress,u8 length)
// 描述: 写N个字节函数.
// 参数: EE_address:  要写入的EEPROM的首地址.
//       DataAddress: 要写入数据的指针.
//       length:      要写入的长度
// 返回: 0: 写入正确.  1: 写入长度为0错误.  2: 写入数据错误.
// 版本: V1.0, 2014-6-30
//========================================================================
u16 EEPROM_write_n(u32 EE_address,u8 *DataAddress,u16 length)
{
    u16  i;
    u16 j;
    u8  *p;
   
    if(length == 0) return 1;   //长度为0错误

    IAP_ENABLE();                       //设置等待时间,允许IAP操作,送一次就够
    i = length;
    j = EE_address;
    p = DataAddress;
    IAP_WRITE();                            //宏调用, 送字节写命令
    do
    {
        IAP_ADDRE = (u8)(EE_address >> 16); //送地址高字节(地址需要改变时才需重新送地址)
        IAP_ADDRH = (u8)(EE_address >> 8);  //送地址中字节(地址需要改变时才需重新送地址)
        IAP_ADDRL = (u8)EE_address;         //送地址低字节(地址需要改变时才需重新送地址)
        IAP_DATA  = *DataAddress;           //送数据到IAP_DATA,只有数据改变时才需重新送
        EEPROM_Trig();                      //触发EEPROM操作
        EE_address++;                       //下一个地址
        DataAddress++;                      //下一个数据
    }while(--length);                       //直到结束

    EE_address = j;
    length = i;
    DataAddress = p;
    i = 0;
    IAP_READ();                             //读N个字节并比较
    do
    {
        IAP_ADDRE = (u8)(EE_address >> 16); //送地址高字节(地址需要改变时才需重新送地址)
        IAP_ADDRH = (u8)(EE_address >> 8);  //送地址中字节(地址需要改变时才需重新送地址)
        IAP_ADDRL = (u8)EE_address;         //送地址低字节(地址需要改变时才需重新送地址)
        EEPROM_Trig();                      //触发EEPROM操作
        if(*DataAddress != IAP_DATA)        //读出的数据与源数据比较
        {
            i = 2;
            break;
        }
        EE_address++;
        DataAddress++;
    }while(--length);

    DisableEEPROM();
    return i;
}





void iap_init()
{
    dwMemorySize = 32*1024;
    wSectorSize = 512;
    dwSectorNumber = dwMemorySize / wSectorSize;
}

BOOL iap_check()
{
    return 1;
}

void iap_program_byte(DWORD addr, BYTE dat)
{
    EEPROM_write_n(addr, &dat, 1);
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

void iap_erase_sector(DWORD addr)
{
    EEPROM_SectorErase(addr);
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

void iap_readsector(DWORD addr, BYTE *pdat)
{
    EEPROM_read_n(addr, pdat, wSectorSize);
}

void iap_writesector(DWORD addr, BYTE *pdat)
{
    EEPROM_SectorErase(addr);
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    EEPROM_write_n(addr, pdat, wSectorSize);
}

ai8051 的官方例程中 应该是没有实现  MEMTYPE_INT, 应该需要用楼主写的上面这段代码。不过我实际使用时,发现无法写入文件,格式化是成功了。

点评

设置32K以上。 为什么叫内部FLASH U盘,你得给它申请可擦写的空间呀。 [attachimg]147766[/attachimg]  详情 回复 发表于 2026-8-21 09:43
回复

使用道具 举报 送花

已绑定手机

124

主题

5136

回帖

1万

积分

超级版主

无情的代码机器

积分
11480
 楼主| 发表于 2026-8-21 09:43:44 | 显示全部楼层
xie2*** 发表于 2026-8-21 09:38
#define     IAP_STANDBY()   IAP_CMD = 0     //IAP空闲命令(禁止)
#define     IAP_READ()      IAP_CM ...


设置32K以上。
为什么叫内部FLASH U盘,你得给它申请可擦写的空间呀。
截图202608210943029076.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-11-10 13:26 , Processed in 0.085038 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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