最近一段时间在做I2C通信协议,需要在两块STM32之间做I2C通信,定的是主机用IO口模拟,从机用的是STM32的硬件I2C,我的项目要求是需要主从机之间能够进行一串数据收发而不出错,实验时在主机方面,利用IO口模拟主机,只需要理解时序就够了,同时将速度能够控制在100K(标准)左右,基本的时序理解网上大把的资料,所以主机这一...
硬件I2C的从机接收数据一般分为三类:中断接收、DMA接收和轮询接收; 在实际项目中中断接收和DMA接收比较常见,因为不用占据CPU资源,有数据来了才响应接收【需要CPU具有硬件I2C功能】。 而轮询接收数据很占用CPU资源,一般是CPU没有硬件I2C资源,处理的数据不多的情况下。 硬件I2C从机配置I2C这一块比较简单,和上面主机类...
可能需要在发送一下起始位(协议上这样写,但是笔者没用到也可以实现传输) 主机发送从机的寄存器地址 -> 等待从机应答 主机再次发送从机地址 -> 等待从机应答 主机向从机接收数据 -> 等待从机应答 发送停止位 -> 等待从机应答 3、I2C设备地址 每个I2C 器件都有一个设备地址,通过发送具体的设备地址来决定访问哪...
【主机/从机】-【序列】-【阻塞/中断/DMA】-【收/发】 其中主机模式特有【内存存取】模式 例如: HAL_I2C_Master_Transmit,为【主机阻塞方式普通发送】 HAL_I2C_Mem_Read_DMA,为【主机DMA方式读从机内存】 HAL_I2C_Slave_Seq_Transmit_DMA,为【从机序列DMA方式发送】 【主从机】决定是谁发送SCL 【阻塞/中断...
TX_EMPTY 当发送缓冲器等于或者低于IC_TX_TL寄存器中规定的阈值时被置位;当数据高于阈值时标志位将被自动清除 TX_ABRT 当i2c模块无法完成处理器下达的命令时被置位,有如下几种原因: * 发送地址字节后没有从机应答 * 地址识别成功后主机发送的数据从机没有应答 ...
最后两个分别是启用 DMA 接收请求和启用 DMA 发送请求,只有开启它们DMA和I2C才能关联上。 到此初始化基本完成。 2、中断处理程序 1、I2C中断处理程序 这里就判断是否地址匹配,如果匹配,判断是读还是写,这里读写以主机视角确定,如果是WRITE,说明从机此时要接收数据。(这里我发现不同的版本和系列定义的还不一样,使...
STM32F10x_硬件I2C主机(发送数据 - 轮询方式)实例源代码工程: https://yunpan.cn/cMKS6muF6643V访问密码 8e16 STM32F10x_硬件I2C从机(接收数据 - 中断方式)实例源代码工程: https://yunpan.cn/cMKSMCkcn8tKv访问密码 f3ad STM32F1资料: https://yunpan.cn/crBUdUGdYKam2访问密码 ca90 ...
(8)主机的一次发送通信,其发送的数据数量不受限制,当主机发送完最后一个数据字节并收到从机的ACK信号后,通过向从机发送一个结束信号(P)结束本次通信并释放总线。从机收到结束信号后也退出与主机之间的通信。 I2C总线主机发送数据流程(8位从机地址)如图所示。
SLAVE_ADDRESS(从机地址):主机现在说,我要访问这个地址所在的设备!I2C总线上的每个设备都有自己的独立地址,主机发起通讯时,通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机。设备地址可以是7位或10位。 R/W(读写位):接下来主机表示,我的访问操作是向这个设备写入数据,R/W置为0,表示我要写入!这个设备,你...