[其他] 基于MM32F0140的I2C与24C02通信

[复制链接]
2583|2
 楼主| MindMotion 发表于 2023-10-10 11:37 | 显示全部楼层 |阅读模式
本帖最后由 MindMotion 于 2023-10-10 11:37 编辑

前提

Mini_F0140原理图上I2C连接着24C02:

984356524b8eed9d41.png

一、IIC介绍

I2C(Inter-Integrated Circuit)是一种通用的总线协议,实现I2C需要两根信号线完成信息交换,SCL时钟作为信号线,SDA作为数据输入/输出线。I2C属于同步通信,由于输入输出数据均使用一根线,因此通信方向为半双工。

主要特征有:
1. I2C 总线协议转换器/并行总线
2. 半双工同步操作
3. 支持主从模式
4. 支持 7 位和 10 位地址格式
5. 支持起始(START)、停止(STOP)、重新起始(RESTART)以及应答(ACK)信号的生成和检测
6. 支持标准模式(最大 100Kbps)、快速模式(最大 400Kbps)
7. 分别有 2 字节的发送和接收缓冲
8. 支持过滤毛刺功能
9. 支持 DMA 操作
10. 支持中断和查询操作
11. 支持多个从地址(详细见用户手册)

下图为信号变化及其特定含义:

200256524ba9172125.png

当主发送器如下图所示传输数据时,从接收器在接收到的每个字节后产生一个 ACK 来响应主发送器。

588096524baab36941.png

二、24C02

24C02是低工作电压的2K位串行电可擦除只读存储器,内部组织为256个字节,每个字节8位,该芯片被广泛应用于低电压及低功耗的工商业领域。
主器件通过发送一个起始信号启动发送过程,然后发送它所要寻址的从器件的地址。8位从器件地址的高4位固定为1010。接下来的3位(A2、A1、A0)为器件的地址位。当接收数据时,与I2C连接的从器件名为0xA0。

三、例程

向从机写数据后,再读取数据。

1. I2C配置
  1. RCC_APB1PeriphClockCmd(RCC_APB1ENR_I2C1, ENABLE);
  2.     I2C_StructInit(&I2C_InitStruct);
  3.     //Configure I2C as master mode
  4.     I2C_InitStruct.Mode = I2C_CR_MASTER;
  5.     I2C_InitStruct.OwnAddress = 0;
  6.     I2C_InitStruct.Speed = I2C_CR_STD;
  7.     I2C_InitStruct.ClockSpeed = 100000;
  8.     I2C_Init(I2Cx, &I2C_InitStruct);
  9.     I2C_Send7bitAddress(I2Cx, 0xA0, I2C_Direction_Transmitter);
  10.     I2C_Cmd(I2Cx, ENABLE);

2. 定义24C02结构体
  1. typedef struct {
  2.     u8 busy;
  3.     u8 ack;
  4.     u8 fault;
  5.     u8 opt;
  6.     u8 sub;
  7.     u8 cnt;
  8.     u8* ptr;
  9.     u8 sadd;
  10. } gEepromTypeDef;

3. 写数据
  1. EEPROM_WriteByte(sub);
  2.     while (cnt --) {
  3.         EEPROM_WriteByte(*ptr);
  4.         ptr++;
  5.     }
  6.     I2C_GenerateSTOP(I2C1, ENABLE);
  7.     while((I2C_GetITStatus(I2C1, I2C_IT_STOP_DET)) == 0);
  8.     gEeprom.ack = true;
  9.     gEeprom.busy = false;
  10.     EEPROM_WaitEEready();
  11.     return true;

4. 读数据
  1. u8 i, flag = 0, _cnt = 0;
  2.     for (i = 0; i < gEeprom.cnt; i++) {
  3.         while(1) {
  4.             //Write command is sent when RX FIFO is not full
  5.             if ((I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFNF)) && (flag == 0)) {
  6.                 I2C_ReadCmd(I2C1);
  7.                 _cnt++;
  8.                 if (_cnt == gEeprom.cnt)
  9.                     flag = 1;
  10.             }
  11.             //Check receive FIFO not empty
  12.             if (I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_RFNE)) {
  13.                 gEeprom.ptr[i] = I2C_ReceiveData(I2C1);
  14.                 break;
  15.             }
  16.         }
  17. }

5. 结果

460666524bfc1aa01a.png





单片小菜 发表于 2023-11-24 17:22 | 显示全部楼层
这个是软件模拟I2C还是硬件模式的I2C?
Henryko 发表于 2023-11-27 10:53 来自手机 | 显示全部楼层
模拟的iic吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:上海灵动微电子股份有限公司
简介:上海灵动微电子股份有限公司成立于 2011 年,是中国本土通用 32 位 MCU 产品及解决方案供应商。 灵动股份的 MCU 产品以 MM32 为标识,基于 Arm Cortex-M 系列内核,自主研发软硬件和生态系统。目前已量产近 300 多款型号,累计交付超 4 亿颗,在本土通用 32 位 MCU 公司中位居前列。

93

主题

111

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部