stm32-IIC

i^2c,iiCBus,集成电路总线,同步串行半双工通信总线方式

sck:时钟同步信号

SDA:发送数据

GND:接地

通信对象:芯片与芯片


主从应答方式:

SDA:数据总线

SCL:时钟总线


在硬件设计中:

上拉电阻:保证双方都在释放总线时,都保持高电平。

阻值大小:4.7k-10k


通信协议:两个设备,无论在SDA还是、scl,未通信都是高电平

通信时,sda变低信号,意味着开始通信,

主机让sck发出标准方波(高位先行)时钟线速率(100Kbps-400Kbps)

sda置高不允许在SCK置高时置高,所以,当sda发送数据时,SCK必须保持稳定。

接收方会在高电平时采样。

发送一段1010 1100的数据,


当发送第九个bit时,主机会无条件发送一个高电平,从机给一个应答将其拉低,称之为ACK

从机不应答将其拉低,称之为NACK

停止位,双方同时置高,发送结束

理论上i2c可以连接2^7个传感器

1010 0001末尾这位0、1表示数据流向

低电平:主机流向从机 ACK 写

高电平:从机流向主机 NACK 读

DEVICE ADDRESS 寄存器地址

WORD ADDRESS 数据地址

RISC精简指令微处理器、

cpp 复制代码
void i2c_interrupt_handler(void)
{
	 i2c_flag=1;
} 
void init_i2c(void)
{
	IICCON |= (1 << 7);
	IICCON |= (1 << 6);
	IICCON |= (1 << 5);
	IICCON &= ~(0xF << 0);

	GPECON |= ((unsigned int)10 << 28);

	register_irq(i2c_interrupt_handler, 27);
	enable_irq(27);
}

void do_and_wait_ack(void)
{
	i2c_flag=0;
	IICCON &= ~(1<<4);
	while(i2c_flag == 0)
	{
		delayus(400);
	}
}
cpp 复制代码
void at24c02_writes(unsigned char device_address,unsigned char reg_address,const unsigned char *pData,unsigned int len)
{
	unsigned int i;
	IICSTAT =0xF0;

	IICDS = device_address;
	do_and_wait_ack();
	IICDS = reg_address;
	do_and_wait_ack();

	for(i=0;i<len;++i)
	{
		IICDS = *pData++;
		do_and_wait_ack();
	} 

	IICSTAT = 0XD0;
	IICCON &= ~(1<<4);
	delayus(400);;
}
cpp 复制代码
void at24c02_read(unsigned char device_address,unsigned char reg_address,unsigned char *pData,unsigned int len)
{
	unsigned int i;
	IICSTAT =0xf0;
	IICDS = device_address;
	do_and_wait_ack();

	IICDS = reg_address;
	do_and_wait_ack();

	IICSTAT = 0xB0;
	IICDS = device_address;
	do_and_wait_ack();

	*pData = IICDS;
	do_and_wait_ack();

	for(i=0;i<len;++i)
	{
		if(i == (len-1))
		{
			IICCON &= ~(1<<7);
		}
		*pData++ = IICDS;
		do_and_wait_ack();
	}
	IICSTAT = 0x90;
	IICCON &= ~(1<<4);
	delayus(400);
	IICCON |= (1<<7);
}
相关推荐
女神下凡8 分钟前
芯参谋(83):AliOS Things_驱动开发指南
arm开发·驱动开发·单片机·嵌入式硬件·设计规范·1024程序员节
女神下凡22 分钟前
芯参谋(84):Linux eMMC 驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件
szxinmai主板定制专家12 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
HQB202615 小时前
屹晶微电子 EG1130|2‑24V 输入 / 最高 28V 输出 内置 MOS 异步升压 DC‑DC|SOT23‑6|摄像头 / 车充 / 电池充电电源
嵌入式硬件·硬件工程
泛凡(Linyongui)16 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
十年磨一剑~17 小时前
Linux 内核中断处理机制与软硬件协同流程
linux·嵌入式硬件
糖糖单片机设计18 小时前
基于单片机的热水器节能控制系统
单片机·嵌入式硬件
数字新视界18 小时前
数字孪生技术赋能智能化转型与创新实践
嵌入式硬件·物联网·系统架构·机房管理·动力与环境监控系统
HQB202619 小时前
屹晶微电子 EG1195|10‑120V/10A+ 外置 MOS 异步降压控制器|ESOP‑8|电动车转换器 / 快充 / 工业电源
嵌入式硬件·硬件工程
不悔哥20 小时前
开源LineageOS:旧手机刷上开源系统
嵌入式硬件·智能手机·开源