找回密码
 立即注册
查看: 130|回复: 6

Ai8051U-32Bit EEPROM读写

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-10-14 09:38:06
已绑定手机

13

主题

43

回帖

185

积分

注册会员

积分
185
发表于 2025-9-28 15:14:11 | 显示全部楼层 |阅读模式
Ai8051U实验箱V1.2\Ai8051U-32Bit\19-通过串口发送命令读写EEPROM测试程序\C语言


用这个Demo更改了以下两处
#define     MAIN_Fosc       40000000L   //定义主时钟(精确计算115200波特率)
P_SW1 |= 0x40;      //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7, 0xC0: P4.3 P4.4

用读写命令测试报错

eeprom_error.png
回复

使用道具 举报 送花

3

主题

1880

回帖

608

积分

等待验证会员

积分
608
发表于 2025-9-28 15:18:00 | 显示全部楼层
关于 Ai8051U-32Bit EEPROM 读写测试中报错的分析与解决方案

各位开发者:

在使用 Ai8051U实验箱 V12 中的 19-通过串口发送命令读写EEPROM测试程序(C语言实现)进行 EEPROM 操作时,若更改了以下两处代码:
  1. c
  2. define     MAINFosc       40000000L   //定义主时钟(精确计算115200波特率)
  3. PSW1 |= 0x40;      //UART1 switch to, 0x00: P30 P31, 0x40: P36 P37, 0x80: P16 P17, 0xC0: P43 P44
复制代码

并在此基础上进行读写命令测试时出现报错,本文将从以下几个方面进行分析并提出解决方案:

一、问题现象

在修改了主频 MAINFosc 和串口引脚映射 PSW1 后,使用串口发送命令读写 EEPROM 时出现通信失败、数据错误或系统异常等报错现象。

二、可能原因分析

1. 波特率计算错误导致串口通信失败

在修改主频 MAINFosc 为 40000000L 后,需重新计算 UART 的波特率寄存器值。若未正确配置,可能导致实际波特率与预期不符,从而造成串口通信失败或数据错乱。

UART 波特率计算公式如下(以标准模式为例):
  1. c
  2. BaudRate = MAINFosc / (16  (256 - TH1))
复制代码

因此,TH1 的值应为:
  1. c
  2. TH1 = 256 - (MAINFosc / (16  BaudRate))
复制代码

对于 115200 波特率,若未正确设置 TH1,将导致接收端无法正确解析数据,从而报错。
✅ 建议:检查 UART 初始化函数中 TH1、TL1 的设置是否匹配新的主频。

2. 串口引脚映射冲突或未启用对应端口

PSW1 |= 0x40; 表示将 UART1 映射到 P36/P37 引脚。但需注意:
是否已正确使能对应端口为输出/输入功能?
是否有其他外设或配置与该端口冲突?
是否在初始化前未清空 PSW1 的其他位?
✅ 建议:
- 使用 PSW1 = 0x40; 而非 |= 0x40,避免其他位干扰。
- 确保 P36/P37 已配置为 UART 功能(即非 GPIO 模式)。

3. EEPROM 读写时序或地址配置错误

EEPROM 通信通常基于 I2C 或 SPI 接口。若主频变化影响了 I2C/SPI 的时钟速率,可能导致读写失败。
✅ 建议:检查 I2C/SPI 的初始化代码,确保其时钟分频系数适配新的主频。

4. 中断或延时函数未适配新主频

部分 EEPROM 操作依赖延时函数或中断定时器,主频更改后若未重新配置定时器初值,可能导致操作超时或误判。
✅ 建议:检查系统延时函数、定时器中断配置是否与 MAINFosc = 40000000L 匹配。

三、解决步骤建议

步骤一:验证 UART 通信是否正常

1. 使用串口调试助手(如 XCOM、SSCOM)发送简单字符,验证是否能正确回显。
2. 检查 TH1 设置是否正确:
  1. c
  2. TH1 = 256 - (40000000L / (16  115200));
复制代码

计算得:
  1. c
  2. TH1 ≈ 256 - 21.7 ≈ 234
复制代码

因此应设置:
  1. c
  2. TH1 = 0xEA;
复制代码

3. 确保设置:
  1. c
  2. TMOD |= 0x20;    // 设置定时器1为模式2(8位自动重装)
  3. TR1 = 1;         // 启动定时器1
  4. REN = 1;         // 使能串口接收
复制代码

步骤二:确认串口映射是否生效
  1. c
  2. PSW1 = 0x40;    // 将 UART1 映射到 P36/P37
复制代码

确保未使用其他复用功能冲突。

步骤三:验证 EEPROM 通信接口
若使用 I2C,检查 I2CCLK 是否正确设置。
若使用 SPI,检查 SPI 时钟分频是否适配。
使用示波器或逻辑分析仪查看 EEPROM 的 SCL/SDA 或 MOSI/MISO 信号是否正常。

步骤四:调试 EEPROM 命令响应流程

1. 发送命令后是否收到 EEPROM 的 ACK?
2. 写入地址后是否等待 EEPROM 写入完成(一般需 5ms)?
3. 读取操作前是否重新发送地址?

建议使用调试串口输出中间状态,便于定位问题点。

四、示例代码片段(适配 40MHz 主频)
  1. c
  2. include
  3. define MAINFosc       40000000L
  4. define BAUDRATE       115200
  5. void UARTInit() {
  6.     SCON = 0x50;            // 8位数据,1位停止位,允许接收
  7.     TMOD |= 0x20;           // 定时器1,模式2
  8.     TH1 = 256 - (MAINFosc / (16  BAUDRATE)); // 设置波特率
  9.     TL1 = TH1;
  10.     TR1 = 1;                // 启动定时器1
  11.     REN = 1;                // 使能串口接收
  12.     ES = 1;                 // 使能串口中断
  13.     EA = 1;                 // 全局中断使能
  14. }
  15. void main() {
  16.     PSW1 = 0x40;           // UART1 映射到 P36/P37
  17.     UARTInit();
  18.     while (1) {
  19.         // EEPROM 读写操作逻辑
  20.     }
  21. }
复制代码

五、结语

在 Ai8051U 实验平台中进行 EEPROM 读写测试时,务必确保:
主频与波特率、定时器配置一致;
UART 映射正确且端口无冲突;
EEPROM 通信接口配置适配新主频;
操作流程符合 EEPROM 的时序规范。

如仍无法解决问题,建议提供完整的代码片段及报错信息,以便进一步分析。

祝各位开发顺利!

国芯人工智能 技术支持团队  
2025年4月5日

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-10-15 08:50:20
已绑定手机

85

主题

3256

回帖

7196

积分

荣誉版主

无情的代码机器

积分
7196
发表于 2025-9-28 15:30:40 | 显示全部楼层

检查下相关IO配置,以及跳线开关切换
截图202509281529201619.jpg

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-10-14 09:38:06
已绑定手机

13

主题

43

回帖

185

积分

注册会员

积分
185
发表于 2025-9-29 09:42:51 | 显示全部楼层
erci*** 发表于 2025-9-28 15:30
检查下相关IO配置,以及跳线开关切换

PCBA是我们自己的,例程工程如附件,请帮忙验证下,谢谢

19-通过串口发送命令读写EEPROM测试程序.rar

29.92 KB, 下载次数: 6

点评

在实验箱上直接测试是正常的,检查硬件连接以及下载时是否正确选择了IRC频率: [attachimg]116330[/attachimg] [attachimg]116331[/attachimg]  详情 回复 发表于 2025-9-29 09:54
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-10-15 08:50:20
已绑定手机

85

主题

3256

回帖

7196

积分

荣誉版主

无情的代码机器

积分
7196
发表于 2025-9-29 09:54:54 | 显示全部楼层
mfsl*** 发表于 2025-9-29 09:42
PCBA是我们自己的,例程工程如附件,请帮忙验证下,谢谢


在实验箱上直接测试是正常的,检查硬件连接以及下载时是否正确选择了IRC频率:
截图202509290954036858.jpg


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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-10-14 09:38:06
已绑定手机

13

主题

43

回帖

185

积分

注册会员

积分
185
发表于 2025-9-29 11:13:35 | 显示全部楼层
erci*** 发表于 2025-9-29 09:54
在实验箱上直接测试是正常的,检查硬件连接以及下载时是否正确选择了IRC频率:

一直用的 IRC=40MHz

另外这个问题请帮忙看下

Ai8051U-32Bit 低功耗
https://www.stcaimcu.com/thread-20329-1-1.html
(出处: 国芯人工智能技术交流网站)


eeprom_error1.png

点评

好的,这个问题,代码已经验证过了,那就着重检查硬件哈,有核心板的话换板子换串口工具都试下。  详情 回复 发表于 2025-9-29 11:21
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-10-15 08:50:20
已绑定手机

85

主题

3256

回帖

7196

积分

荣誉版主

无情的代码机器

积分
7196
发表于 2025-9-29 11:21:20 | 显示全部楼层
mfsl*** 发表于 2025-9-29 11:13
一直用的 IRC=40MHz

另外这个问题请帮忙看下

好的,这个问题,代码已经验证过了,那就着重检查硬件哈,有核心板的话换板子换串口工具都试下。
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 05:51 , Processed in 0.135712 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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