程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)

Mini2440裸机开发之I2C(AT24C08)

通信协议-I2C小节,我们已经对I2C协议以及AT24C08芯片进行了详细的介绍,这里就不在重复赘述。

一、S3C2440上的I2C

1.1 I2C概述

I2C的使用位于S3C2440芯片手册的第20章。S3C2440可以支持一个多主控I2C总线串行接口。一条专用串行数据线(SDA)和一条专用串行时钟线(SCL)连接到I2C总线的总线主控和外设之间的信息。SDA和SCL线都为双向的。

为了控制多主控IIC总线操作,必须写入值到以下寄存器中:

  • 多主控IIC总线控制寄存器,IICCON;
  • 多主控IIC总线控制/状态寄存器,IICSTAT;
  • 多主控IIC总线Tx/Rx数据移位寄存器,IICDS;
  • 多主控IIC总线地址寄存器,IICADD;

1.2 I2C方块图

可以通过编程IICCON寄存器的4位预分频器值来控制串行时钟SCL的频率,I2C总线接口地址被存储在IICADD寄存器。

1.3 I2C总线接口

S3C2440的I2C总线接口有 4 种工作模式:

  • 主机发送模式;
  • 主机接收模式;
  • 从机发送模式;
  • 从机接收模式;

二、I2C相关寄存器

2.1 IIC总线控制寄存器IICCON

寄存器 地址 R/W 描述 复位值
IICCON 0x54000000 R/W IIC总线控制寄存器 0x0X

寄存器位信息:

IICCON 描述 初始状态
应答发生 [7]

IIC总线应答使能位

0:禁止       1:允许

对于发送模式。不需要配置ack应答信号

对于接收模式,设置为1,让它在第9个CLK发出ack应答信号

0
TX时钟源选择 [6]

SCL时钟源选择位

0:IICCLK = PCLK/16    1:IICCLK=PCLK/512

0
TX/RX中断 [5]

IIC总线TX/RX中断使能/禁止位

0:禁止      1:允许

0
中断挂起标志 [4]

IIC总线TX/RX中断标志位。

当此位为1时,SCL被拉低,IIC传输停止;

如果要继续传输,需要写入0清除它;

当读出此位为0时,表示没有中断发生,当读出此位为1时表示有中断发生;

0
发送时钟值 [3:0]

IIC总线发送时钟预分频系数:

SCL = IICCLK/(IICCON[3:0]+1)

未定义

 2.2 IIC总线控制/状态寄存器IICSTAT

寄存器 地址 R/W 描述 复位值
IICSTAT 0x54000004 R/W IIC总线控制/状态寄存器 0x0

寄存器位信息:

IICSTAT 描述 初始状态
模式选择 [7:6]

模式选择

00:从接收模式

01:从发送模式

10:主接收模式

11:主发送模式

00
忙信号状态/起始停止条件 [5]

IIC总线忙信号状态位

当读的时候,0表示not busy,1表示busy

当写的时候,0表示写入STOP,1表示写入START

0
串行输出 [4]

IIC总线数据输出使能/禁止:

0:禁止    1:使能

00
仲裁状态标志位 [3]

IIC总线仲裁过程状态标志位

0:总线仲裁成功    1:串行I/O间总线仲裁失败

0
从地址状态标志 [2]

IIC总线从地址状态标志位

0:发现起始/停止条件清除  1:接收到从地址与IICADD中地址值匹配

0
地址零状态标志 [1]

 IIC总线地址零状态标志位

0:发现起始/停止条件清除    1:接收从地址为0x000000b

 0
最后收到位状态标志 [0]

IIC总线最后收到位状态标志

表示I2C总线上的第9个时钟周期有没有ack,0表示有ack, 1表示无ack

 0

2.3 IIC总线地址寄存器IICADD

寄存器 地址 R/W 描述 复位值
IICADD 0x54000008 R/W IIC总线地址寄存器 0x0XX

寄存器位信息:

IICADD 描述 初始状态
从设备地址 [7:0]

从设备7位地址

当IICSTAT中串行输出使能=0时,IICADD为写使能;

从地址:[7:1]

未映射:[0]

XXXXXXXX

2.4 IIC总线发送/接收以为寄存器IICDS

寄存器 地址 R/W 描述 复位值
IICDS 0x5400000C R/W IIC总线发送/接收移位寄存器 0x0XX

寄存器位信息:

IICDS 描述 初始状态
从设备地址 [7:0]

IIC总线TX/RX操作的8位数据移位寄存器

当IICSTAT中串行输出使能=0时,IICADS为写使能;

XXXXXXXX

三、读写操作流程 

3.1. 主机发送模式

其流程如下:

  1. 设置IICCON寄存器;;
    • 允许应答,位[7]=1;
    • 使能中断,位[5]=1;
    • 定义SCL周期,位[6]、[3:0];
  2. 设置IICSTAT位[4]使能串行输出;
  3. 写从设备的地址到IIICDS寄存器;
  4. 写0xF0到IICSTAT发送IICDS中的数据;
    • 使能串行输出,位[4]=1;
    • 配置主机为TX模式,位[7:6]=11;
    • 主设备开始发送START信号;
  5. IICDS中配置的数据(从设备地址7位 + 读写1位位)被发送出去,每传输完一个字节数据将产生一个中断;
  6. 清除IICCON挂起位位[4];
  7. 通过查询IICSTAT位[0]判断是否接收到从设备的ACK应答;
    • 如果没有接收到从设备ACK应答:写0xD0到IICSTAT,写0xAF到ICCCON,主设备发送停止信号,等待一会等待停止信号生效;
    • 如果接收到从设备ACK应答:继续向IICDS写入要发送的数据,数据被发送出去,继续IIC数据传输;

3.2 主机接收模式

其流程如下:

  1. 设置IICCON寄存器;
    • 允许应答,位[7]=1;
    • 使能中断,位[5]=1;
    • 定义SCL周期,位[6]、[3:0];
  2. 设置IICSTAT位4使能串行输出;
  3. 写从设备的地址到IIICDS寄存器;
  4. 写0xB0到IICSTAT发送IICDS中的数据;
    • 使能串行输出,位[4]设置为1;
    • 配置主机为RX模式,位[7:6]设置为10;
    • 主设备开始发送START信号;
  5. IICDS中配置的数据(从设备地址7位 + 读写1位位)被发送出去,每传输完一个字节数据将产生一个中断;
  6. 清除IICCON挂起位位[4];
  7. 通过查询IICSTAT位[0]判断是否接收到从设备的ACK应答;
    • 如果没有接收到从设备ACK应答:写0x90到IICSTAT,主设备发送停止信号,等待一会等待停止信号生效;
    • 如果接收到从设备ACK应答:从IICDS读取数据,并清除IICCON挂起位,数据被接收到,主设备发送应答信号,继续IIC数据读取;

四、代码

4.1 硬件接线

Mini2440开发板外接了一个I2C信号引脚的EEPROM芯片AT24C08,它有1024字节,供用户测试I2C总线。

这里I2CSCL连接的S3C2440引脚GPE14、I2CSCL连接的S3C2440引脚GPE15。

4.2 I2C初始化

4.2.1 IO状态设置

设置GPE14、GPE15功能复用为I2C。设置GPE控制寄存器,同时禁止GPE14、GPE15为上拉使能。

 

  GPECON &= ~((3<<28) | (3 <<30));    /* 清零 */
  GPECON |= ((2<<28) | (2<<30));      /* 设置为IIC */
  GPEUP |= 0xc000;     /* 禁止内部上拉 */
4.2.2 设置TX/RX中断、SCL周期
  /* 允许应答、使能TX/RX中断、SCL周期  */
  IICCON |= (1<<7 | 0<<6 | 1<<5 | 0xf);
  IICSTAT |= (1<<4);           /* 使能TX/RC */

允许应答。PLCK为50MHz,IICCLK=  PCLK/`16,允许中断,发送时钟 = IICLK/16。

SCL时钟频率为:int(5000000016(15+1))=1953125=0.198MHZ

亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。

日期姓名金额
2023-09-06*源19
2023-09-11*朝科88
2023-09-21*号5
2023-09-16*真60
2023-10-26*通9.9
2023-11-04*慎0.66
2023-11-24*恩0.01
2023-12-30I*B1
2024-01-28*兴20
2024-02-01QYing20
2024-02-11*督6
2024-02-18一*x1
2024-02-20c*l18.88
2024-01-01*I5
2024-04-08*程150
2024-04-18*超20
2024-04-26.*V30
2024-05-08D*W5
2024-05-29*辉20
2024-05-30*雄10
2024-06-08*:10
2024-06-23小狮子666
2024-06-28*s6.66
2024-06-29*炼1
2024-06-30*!1
2024-07-08*方20
2024-07-18A*16.66
2024-07-31*北12
2024-08-13*基1
2024-08-23n*s2
2024-09-02*源50
2024-09-04*J2
2024-09-06*强8.8
2024-09-09*波1
2024-09-10*口1
2024-09-10*波1
2024-09-12*波10
2024-09-18*明1.68
2024-09-26B*h10
2024-09-3010
2024-10-02M*i1
2024-10-14*朋10
2024-10-22*海10
2024-10-23*南10
2024-10-26*节6.66
2024-10-27*o5
2024-10-28W*F6.66
2024-10-29R*n6.66
2024-11-02*球6
2024-11-021*鑫6.66
2024-11-25*沙5
2024-11-29C*n2.88
posted @   大奥特曼打小怪兽  阅读(426)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
如果有任何技术小问题,欢迎大家交流沟通,共同进步

公告 & 打赏

>>

欢迎打赏支持我 ^_^

最新公告

程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)。

了解更多

点击右上角即可分享
微信分享提示