历史上的今天
返回首页

历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2019年11月09日 | STM8S_010_I2C读写EEPROM(硬件方式)

2019-11-09 来源:eefocus

Ⅰ、写在前面


相信看过前面那篇文章“更加深入理解I2C总线、协议及应用”的人对I2C都有一定的了解了。那篇文章是针对I2C,使用单片机IO模拟I2C方式实现读写操作。


本文将讲述硬件I2C读写操作,也就是由处理器自身硬件的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);


}


 


Ⅳ、下载


STM8S资料:


http://pan.baidu.com/s/1o7Tb9Yq



软件源代码工程两版本(STM8S-A10_I2C读写EEPROM(硬件)):


http://pan.baidu.com/s/1c2EcRo0



提示:如果网盘链接失效,可以微信公众号“底部菜单”查看更新链接。



推荐阅读

史海拾趣

百佳(BAIJIA)公司的发展小趣事

随着第四套人民币的发行和我国市场经济的改革开放,假币问题日益严重,百佳公司敏锐地抓住了这一市场机遇。他们迅速开发出既能点钞又能防伪的点钞机等金融机具,满足了市场的迫切需求。凭借过硬的产品质量和良好的口碑,百佳公司在金融机具市场上迅速崛起,成为了行业的佼佼者。

辉芒微(FMD)公司的发展小趣事

近年来,辉芒微积极筹备上市工作,旨在通过资本市场进一步拓展融资渠道和品牌影响力。尽管在上市过程中经历了两次撤回申请资料的波折,但公司始终保持着对资本市场的热情和信心。通过不断优化内部管理、提升产品竞争力和加强市场拓展,辉芒微最终赢得了市场的广泛认可。其产品被广泛应用于智能家居、生活电器、智能穿戴等领域,并与小米、飞科、中兴等众多知名品牌建立了长期稳定的合作关系。

安森德(Ascend)公司的发展小趣事

在快速发展的过程中,安森德公司始终注重品牌建设和文化塑造。公司坚持以客户为中心的服务理念,不断提升产品质量和服务水平。同时,安森德还积极参与各类行业活动和公益事业,提升公司的社会形象和品牌价值。在内部管理方面,公司倡导创新、协作、担当的企业文化,为员工提供了一个良好的工作环境和发展平台。这些举措不仅增强了员工的归属感和凝聚力,也为公司的长远发展奠定了坚实的基础。

常忆科技(CHINGIS)公司的发展小趣事

为了满足不断增长的市场需求,常忆科技积极拓展国内外市场。公司通过与全球知名的电子产品制造商建立合作关系,成功将产品打入国际市场。同时,常忆科技还积极参加各类国际电子展会和技术交流活动,展示其最新的技术和产品,吸引了众多国际客户的关注。

随着国际化战略的深入实施,常忆科技的产品逐渐在全球范围内得到应用。这不仅提升了公司的品牌知名度和影响力,也为公司带来了丰厚的经济回报。

硕颉(BITEK)公司的发展小趣事

为了持续提升产品质量和客户满意度,硕颉科技于2005年通过了ISO9001质量管理体系认证。这一认证标志着公司在质量管理方面达到了国际标准,也进一步提升了公司的行业地位和竞争力。通过实施严格的质量管理体系,硕颉科技确保了产品从设计、研发到销售的每一个环节都符合高质量标准,为客户提供了可靠的产品和服务。

这些故事只是硕颉科技发展历程中的一部分,它们共同展示了公司在电子行业中不断壮大、创新发展的历程。未来,硕颉科技将继续秉承创新、质量、服务的理念,不断推出更多优质产品,拓展更广阔的市场空间,为电子行业的发展贡献更多力量。

Futaba Electric Co Ltd公司的发展小趣事

硕颉科技股份有限公司成立于1999年11月,总部设在台北市。自成立以来,公司一直专注于积体电路的设计、研发与销售,致力于为客户提供高质量的电子产品解决方案。在创立初期,硕颉便以其创新的技术和严谨的研发态度,迅速在电子行业崭露头角。公司资本额为新台币三亿三仟万元,为公司的稳健发展提供了坚实的资金基础。

问答坊 | AI 解惑

用ARM运行FFT,速度怎样?

涉及产品造型问题。无庸置疑,做FFT,DSP是首选,但ARM也有其很诱人的优势,想请教一下用ARM做过FFT的朋友,其速度如何?请告知一下所用的芯片型号、振荡器频率、FFT点数及运行时间。谢谢各位。…

查看全部问答>

warning: function declared implicitly错误原因

     error:function declared implicitly    解决方法:需在在头文件中用extern关键字声明函数  …

查看全部问答>

学习型电脑,平民化配置

CPU:E2200 主板:技嘉GA-G31M(板载X3100显卡,intel G31芯片组)(因为技嘉,华硕价格较贵,可以微星,昂达等G31芯片组的二组主板代替) 内存:金士顿2G,DDR2/800(或金邦,建议不要用威刚,威刚兼容性较差) 显卡:(如有需要可另配,但学习 ...…

查看全部问答>

关于开放式数控系统

要做一个开放式数控铣床这么一个系统,PC上位机 单片机是下位机,要实现数控系统的基本的插补功能...那现在是这么个思路,在PC上建立人机交互界面,如果输入数控代码,自动实现译码,刀补,差补..进而与单片机通信 去控制步进电机的运动.那译码,刀补,差补 ...…

查看全部问答>

STM32F107的通用定时器频率是多少?

                                 STM32F107中,用TIM3的PWM模式,预分频数为0,重装载值为3600,按道理说TIM3的最大频率为36MHz,那么PWM的频率应该 ...…

查看全部问答>

STM8L操作DS18B20失败,求范例

                                 郁闷啊,今天弄了一天DS18B20,先是18B20的初始化都不通过,发送了低电平之后释放,等待DS18B20的低电平应答都检测 ...…

查看全部问答>

【聊聊DSP】个人DSP自学之路!

毕业已一年又一个月,4年的大学时光,可以说我花在学习上的时间不少,基本上每门课都去学,搞到最后整体成绩还好,但每一门又不是很精通。所以现在工作中得恶补了,呵呵~记得在大三时开设了单片机课程,51的,还是汇编语言。当时就对单片机很好奇, ...…

查看全部问答>

LPC810 ISP无法下载了

前两天我发了个帖子,说明LPC810如何用SWD方式(J-LINK)下载 于是我写了下程序,就是点亮那个LED的程序 #include \"lpc8xx.h\" int main(){          LPC_SYSCON->SYSAHBCLKCTRL |= (1DIR0|=1…

查看全部问答>

出一套 CY8CKIT-001 PSoC 开发套件

现出让一套CY8CKIT-001 PSoC 开发套件,该套件是集PSoC 1、PSoC 3、PSoC 5三个系列的学习开发的,共包括一块主板、三块MCU模块、还有一个MINI PROR 程序下载下载器。下面上个图: …

查看全部问答>