历史上的今天
今天是:2024年09月27日(星期五)
2021年09月27日 | 使用STM8L的硬件I2C(一)硬件I2C简介
2021-09-27 来源:eefocus
I2C是常用的外设协议,用途广泛。
很多时候为了实现简单,在STM8上大家都是用GPIO来模拟I2C工作。
STM8L自带硬件I2C,不过相对于模拟I2C的清晰简单,硬件I2C的处理要麻烦一些。
一是必须要理解各寄存器用法,二是使用STD库时还须理解STD抽象出的I2C接口和使用逻辑。
模拟I2C一般情况下使用问题不大,但若同时要处理其他外设或者对延时有要求,模拟方法就力不从心。
使用硬件I2C,是更好的办法。目前STM8L上利用硬件I2C的文章很少,
我来分享一下经验,总体分为以下几个部分介绍:
(一)硬件I2C的简介(本文)
(二)硬件I2C的事件和检测
(三)硬件I2C中断读写(流程及代码)
(四)硬件I2C的使用注意
1、I2C协议回顾
Start: 表示通信开始,SCL为高电平时SDA拉低
Stop: 表示通信结束,SCL为高电平时SDA拉高
Ack:收到8位数据时的回应
NAck:不再接收数据时的回应
ReStart:没有Stop时又一次发出的Start
数据收发:SCL低电平时SDA跳变且只能在SCL低时跳变、SCL高电平时SDA要维持供采样
2、STM8L的I2C功能
STM8L支持硬件I2C,但只提供了一个I2C硬件接口,即I2C1。
其SCL pin为PC1,SDA pin为PC0。
支持Master和Slave, 支持标准频率100KHz和高速400KHz两种速率。
另外,作为高级功能,还支持I2C的SMB模式以及DMA方式传输数据。
3、STM8L的I2C寄存器
所谓硬件I2C,无非是MCU内部实现了I2C协议,由硬件执行控制逻辑。
而MCU对外的接口只有寄存器,所以STM8L提供了很多寄存器用于在各个方面和内部I2C实现做交互。
包含控制、状态、数据缓冲、中断等等方面。具体如下:
控制寄存器:
Control register 1 (I2C_CR1)
Control register 2 (I2C_CR2)
I2C时钟寄存器:
Frequency register (I2C_FREQR)
地址寄存器:(支持10位地址所以有2个地址寄存器)
Own address register LSB (I2C_OAR1L)
Own address register MSB (I2C_OAR1H)
Own address register 2 (I2C_OAR2)
数据寄存器:所有数据发送和接收都用这个寄存器,包括I2C外设地址
Data register (I2C_DR)
状态寄存器:SR1和SR3为通信状态、SR2主要错误状态
Status register 1 (I2C_SR1)
Status register 2 (I2C_SR2)
Status register 3 (I2C_SR3)‘
中断和DMA寄存器:控制中断类型(Event/Buffer/Error)
Interrupt and DMA register (I2C_ITR)
时钟频率控制寄存器:用于设置I2C通信频率
Clock control register low (I2C_CCRL)
Clock control register high (I2C_CCRH)
上升沿控制寄存器:I2C_Init函数会自动设置该寄存器
TRISE register (I2C_TRISER)
Pakcet校验寄存器:硬件I2C支持CRC校验,开启该功能时使用此寄存器
PEC register (I2C_PECR)
全部寄存器:
其中I2C通信控制中最常用的寄存器是:
CR1/CR2/SR1/SR3
史海拾趣
|
我公司一产品上使用了windows ce 4.2 net 版本, 处理器为ARM4VR,分辨率为240*320,现在想寻一款手写软件, 现咨询一下购买这种软件要多少钱? 胡先生 13320807449 QQ:562850914 &n ...… 查看全部问答> |
|
Warning: Found duplicate entry \'binfs.dll NK C:\\WINCE420\\PUBLIC\\11\\RelDir\\SAMSUN~1\\binfs.dll 00000007\' ... skipping Error: Could not ...… 查看全部问答> |
|
Wince 是否支持大页nand flash?文件格式是dosfs吗? Wince是否支持大页nand flash?文件格式是dosfs吗? Wince支持的Nand的大页模式和小页模式是同一个文件系统吗?… 查看全部问答> |
|
如何使用OSAL的事件?OSAL通过一个16位宽度的数组来管理事件,意味着OSAL最多可以支持16个事件,其中最高位(0x08000,SYS_EVENT_MSG)系统保留,用户可以使用的事件有15个。事件的使用很简单:1)需要找个地方定义事件的ID,实际上是指定该事件占 ...… 查看全部问答> |
|
TxMessage.DLC最多是8字节,我一次要发24个。分三次发,发送程序如下TestStatus CAN_Polling(void){ u32 i = 0; u8 m=0; //每次发送的字节数 u8 n=0; ...… 查看全部问答> |




