STM8S_010_I2C读写EEPROM (硬件方式)

周末需要休息,也需要做事,像我这种,周末也不忘写文章分享给你们。目的很简单,就是让你们不休息。
开玩笑啦
像我这种人
还是希望你们多学点知识
正所谓学到老,活到老

写在前面
相信看过前面那篇文章“更加深入理解 i2c总线、协议及应用”的人,对i2c都有一定的了解了。那篇文章是针对i2c使用单片机io模拟i2c方式实现读写操作。
本文将讲述硬件i2c读写操作,也就是由处理器自身硬件的i2c实现时钟、数据的传输过程。
为方便大家阅读,本文内容已经整理成pdf文件:
http://pan.baidu.com/s/1i5uwhjr

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)
2.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);
}
3.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);
}
ⅳ下载
stm8s资料:
http://pan.baidu.com/s/1o7tb9yq
软件源代码工程两版本(stm8s-a10_i2c读写eeprom(硬件)):
http://pan.baidu.com/s/1c2ecro0

MAX8570系列LCD升压转换器
无线测温系统技术在配电柜的应用
以变频器和电机的距离来确定电缆和布线
谷歌无人机送货:意外频频不是挂树就是坠地,看来无人机也不是万能的
高集成度、经济高效的27W电源适配器方案,这两颗芯片功不可没
STM8S_010_I2C读写EEPROM (硬件方式)
音圈电机柔性振动供料系统的工作原理说明
制作激光恒流驱动电路
长光华芯完成B轮1.5亿融资,战略布局已全部完成
关于CCD与CMOS的区别分析
BOE加大8.6代OLED投资,Sunic System成蒸镀机订单热门选择
AFG-303x/AFG-302x任意波形发生器的特点及应用范围
GIC中断 redistributor介绍
澜起科技成功量产PCIe 4.0/5.0 Retimer系列芯片
光线传感器工作原理_光线传感器的作用
防水Nano SIM卡座带卡托连接器性价比高-SIM卡座厂家极力推荐
水分测定仪的工作原理
安森美全新SiC MOSFET器件适用于各种高要求的高增长应用
未来无线技术新战役开启 5G是否最强技术
LED背光与无彩色滤光片技术分析