您的位置 首页 被动

根据运用STM8单片机I2C方法完成读写操作

基于使用STM8单片机I2C方式实现读写操作-STM8S的I2C模块不仅可以接收和发送数据,还可以在接收时将数据从串行转换成并行数据,在发送时将数据从并行转换成串行数据。可以开启或禁止中断。接口通过数据引脚(SDA)和时钟引脚(SCL)连接到I2C总线。允许连接到标准(最高100kHz)或快速(最高400kHz)的I2C总线。

STM8硬件I2C常识

STM8S的I2C模块不只能够接纳和发送数据,还能够在接纳时将数据从串行转换成并行数据,在发送时将数据从并行转换成串行数据。能够敞开或制止中止。接口经过数据引脚(SDA)和时钟引脚(SCL)连接到I2C总线。答应连接到规范(最高100kHz)或快速(最高400kHz)的I2C总线。

1.I2C的4种形式

● 从设备发送形式

● 从设备接纳形式

● 主设备发送形式

● 主设备接纳形式

2.I2C的主要特点

● 并行总线/I2C总线协议转换器

● 多主机功用:该模块既可做主设备也可做从设备

●I2C主设备功用

─ 发生开端和中止信号

●I2C从设备功用

─ 可编程的I2C 地址检测

─ 中止位检测

● 发生和检测7位/10位地址和播送呼叫

● 支撑不同的通讯速度

─ 规范速度(最高 100 kHz)

─ 快速(最高 400 kHz)

● 状况标志:

─ 发送器/接纳器形式标志

─I2C 总线忙标志

─ 主形式时的裁定失利

─ 地址/数据传输后的应对(ACK)过错

─ 检测到过错的开端或中止条件

─ 制止时钟展宽功用时数据过载或欠载

●3种中止

─1 个通讯中止

─1 个出错中止

─1 个唤醒中止

● 唤醒功用

─ 从形式下假如检测到地址匹配能够将MCU 从低功耗形式中唤醒

● 可选的时钟展宽功用

3.主形式所要求的操作次序

● 在I2C_FREQR寄存器中设定该模块的输入时钟以发生正确的时序

● 装备时钟操控寄存器

● 装备上升时间寄存器

● 编程I2C_CR1寄存器发动外设

● 置I2C_CR1寄存器中的START位为1,发生开端条件

●I2C模块的输入时钟频率有必要至少是:

● 规范形式下为:1MHz

● 快速形式下为:4MHz

软件工程源代码1.关于工程

本文供给的工程代码是根据前面软件工程“STM8S-A04_UART根本收发数据”添加I2C接口修正而来。读写EEPROM的方法和之前“模仿I2C读写”的方法不一样。

2.硬件I2C初始化

void I2C_IniTIalizes(void)

{

CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);

I2C_Cmd(ENABLE);

I2C_Init(I2C_SPEED, I2C_SLAVE_ADDRESS7, I2C_DUTYCYCLE_2, I2C_ACK_CURR,

I2C_ADDMODE_7BIT, 16);

}

I2C_SPEED:I2C速度,一般是100K – 400K

I2C_SLAVE_ADDRESS7:从设备地址,作为主设备时,这个地址不起作用。

I2C_DUTYCYCLE_2:快速形式

I2C_ACK_CURR:应对

I2C_ADDMODE_7BIT:设备地址位数

16:输入时钟(单位M)

3.EEPROM_WriteByte写一字节

写一字节分为5个进程:

void EEPROM_WriteByte(uint16_t Addr, uint8_t Data)

{

while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));

/* 1.开端 */

I2C_GenerateSTART(ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

/* 2.设备地址/写 */

I2C_Send7bitAddress(EEPROM_DEV_ADDR, I2C_DIRECTION_TX);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

/* 3.数据地址 */

#if (8 == EEPROM_WORD_ADDR_SIZE)

I2C_SendData((Addr&0x00FF));

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

#else

I2C_SendData((uint8_t)(Addr》》8));

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData((uint8_t)(Addr&0x00FF));

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

#endif

/* 4.写一字节数据 */

I2C_SendData(Data);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

/* 5.中止 */

I2C_GenerateSTOP(ENABLE);

}

4.EEPROM_ReadByte读一字节

读一字节比写一字节多了2个进程,原因是读的时分多写地址到读数据这个切换进程。

void EEPROM_ReadByte(uint16_t Addr, uint8_t *Data)

{

while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));

/* 1.开端 */

I2C_GenerateSTART(ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

/* 2.设备地址/写 */

I2C_Send7bitAddress(EEPROM_DEV_ADDR, I2C_DIRECTION_TX);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

/* 3.数据地址 */

#if (8 == EEPROM_WORD_ADDR_SIZE)

I2C_SendData((Addr&0x00FF));

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

#else

I2C_SendData((uint8_t)(Addr》》8));

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData((uint8_t)(Addr&0x00FF));

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

#endif

/* 4.重新开端 */

I2C_GenerateSTART(ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

/* 5.设备地址/读 */

I2C_Send7bitAddress(EEPROM_DEV_ADDR, I2C_DIRECTION_RX);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

/* 6.读一字节数据 */

I2C_AcknowledgeConfig(I2C_ACK_NONE);

while(I2C_GetFlagStatus(I2C_FLAG_RXNOTEMPTY) == RESET);

*Data = I2C_ReceiveData();

/* 7.中止 */

I2C_GenerateSTOP(ENABLE);

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/347228.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部