这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【分享开发笔记,赚取电动螺丝刀】STC32G12K128单片机以I2C外设访问A

共8条 1/1 1 跳转至

【分享开发笔记,赚取电动螺丝刀】STC32G12K128单片机以I2C外设访问AT24C04存储器 21

专家
2025-07-24 19:33:09     打赏

在学习国芯Ai8051U单片机的I2C外设的时候,例程始终没有跑通。感觉在芯片构造上,Ai8051U与STC32G12K128应该差不多,于是回过头来研究STC32G12K128,使用其I2C外设读写AT24C04。

图片1.png

在读写AT24C04时,WordAddress只需要一个字节就够了。以读操作为例:

AT24C04的任意地址的读操作:

图片2.png

通讯时序中红色标记的P0位置的值,决定访问AT24C04的前后两个256字节中的哪个页。(AT24C04为512字节空间,被划分为两个页,WordAddress是一个字节)。

使用I2C外设作为主机使用时,读写操作中,开始信号、结束信号、收发数据以及Ack、NAck信号,都是通过向I2CMSCR(主机控制寄存器)这个寄存器发送不同的指令来实现的。

测试使用了最简单的电路连接,由STC32G12K128核心板和自制面包板搭建,


原理图如下:

图片5.png

I2C外设使用P2.4和P2.5复用为SCL和SDA。为了便有验证测试结果,使用了串口2(使用P4.6和P4.7)作为log输出。

I2C 配置寄存器(I2CCFG)设置为0xe0,

图片6.png

ENI2C = 1 :表示使能I2C外设

MSSL = 1 :表示工作为主机模式

MSSPEED =100000 :根据公式:I2C 总线速度=SYSCLK / 2 / (MSSPEED * 2 + 4),本例中SYSCLK 为单片机的工作主频,预设为22118400Hz,所以I2C的通讯速度应该是162KHz,实际测试是82KHz左右,似乎是差一倍,原因还没有搞清楚。

主程序中的处理逻辑是采用读-----加一后回写-----再读的方式运行的。



    //-----------------------读取数据-----------------------
    IIC_Read_NByte(SLAVE_24C04,0,dat,5);
    for( i=0;i<5;i++ ) {
        sprintf(str,"地址:%d,值:%d\r\n",i,dat[i]);
        PrintString2(str);
    }
    PrintString2( "读取结束\r\n");
    delay_ms(200);
    //-----------------------写入修改后的数据-----------------------
    for( i=0;i<5;i++ ) {
        dat[i] = (dat[i] +1);
    }
    IIC_Write_NByte(SLAVE_24C04,0,dat,5); 
    delay_ms(200);
    //-----------------------读取数据-----------------------
    IIC_Read_NByte(SLAVE_24C04,0,dat,5);
    for( i=0;i<5;i++ ) {
        sprintf(str,"地址:%d,值:%d\r\n",i,dat[i]);
        PrintString2(str);
    }
    PrintString2( "测试结束\r\n");

实际运行中通过逻辑分析仪铺捉到的I2C通讯逻辑波形如下所以,可以看到有三个明显的I2C通讯过程,就是读-写-读的三组时序。AT24C04事先通过编程器将前八个单元的数据改成了1,2,3,4,5,6,7,8。经过几次测试,数据已经被程序改变成现在的这个样子。

图片7.png


读入的数据时6,7,8,9,10

图片8.png

分别加一后,变成7,8,9,10,11,重写回原来的单元,

图片9.png

再次读取后显示为7,8,9,10,11。

图片10.png

来自串口的log信息:

图片11.png


工程代码:i2c.zip




专家
2025-07-24 20:33:56     打赏
2楼

感谢不想


专家
2025-07-24 20:37:37     打赏
3楼

感谢不想


专家
2025-07-24 20:40:20     打赏
4楼

感谢不想


高工
2025-07-26 15:03:28     打赏
5楼

奇怪了,你板子并没有外挂晶振,sysclk是22m左右是怎么算出来的?用的内部高速IEC二分频分出来的?


高工
2025-07-28 09:11:40     打赏
6楼

I2C 读写验证通信功能正常,总线的波形也可以看出对应的时序,对于理解I2C时许很有帮助


专家
2025-07-30 16:02:21     打赏
7楼

相信很多同学多iic深有感触。

当年stm32出了不少gpio模拟的例子。


院士
2025-07-30 18:17:12     打赏
8楼

这款MCU的I2C外设分频看来是没有分数模式。

不过,I2C对主机通讯频率的容忍度还是挺高的



共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]