历史上的今天

今天是:2024年09月20日(星期五)

正在发生

2018年09月20日 | STM32 24C02函数 I2C例程 非STM32库方式

发布者:lqs1975 来源: eefocus关键字:STM32  24C02函数  I2C例程 手机看文章 扫描二维码
随时随地手机看文章

#define ADDR_24CXX        0xA0
void I2C_24CXX_Write(u16 nAddr, u8* pDat, u16 nLen)
{
   u16 i = 0;
 /* Enable I2C1 acknowledgement if it is already disabled by other function */
 //I2C_AcknowledgeConfig(I2C1, ENABLE);
 STM32_I2c1_Regs->cr1.bit.ACK=1;   //   ACK:应答使能 1:在接收到一个字节后返回一个应答(匹配的地址或数据)
 
 /* Send I2C1 START condition */
 //I2C_GenerateSTART(I2C1, ENABLE);
 STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_START;
   
  /* Test on I2C1 EV5 and clear it */
 // 【SB=1 起始条件已发送 读SR1,然后写数据DR 清零 】   MSL="1主模式"   BUSY="1" 在总线上正在进行数据通讯 )
 //  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)){;}  /* EV5 */
 while(!(STM32_I2c1_Regs->sr1.bit.SB & I2C_SB)) ;


   /* Send slave address for write */
 //I2C_Send7bitAddress(I2C1, ADDR_24CXX, I2C_Direction_Transmitter);
 STM32_I2c1_Regs->dr.bit.DR=ADDR_24CXX;
   
 /* Test on I2C1 EV6 and clear it */
 // 【ADDR=1  地址发送结束;读SR1和SR2来清零 】。  TXE="1" 数据寄存器空 MSL="1" BUSY="1", TRA="1" 数据已发送
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){;} /* EV6 */
 while(!(STM32_I2c1_Regs->sr1.all & I2C_ADDR)) ;
 STM32_I2c1_Regs->sr2.all;


   /* Send the low part of memory address */
   //I2C_SendData(I2C1, (u8)nAddr);
 STM32_I2c1_Regs->dr.bit.DR=(u8)nAddr;


 /* Test on I2C1 EV8 and clear it */
 // 【TXE=1 数据寄存器空; 写数据DR清除,START,STOP】  BTF="1:" 字节发送结束 TRA="数据已发送"  BUSY="在总线上正在进行数据通讯"  MSL="主模式"
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){} /* EV8 */
        while(!(STM32_I2c1_Regs->sr1.all & I2C_TXE));
 
   for(i=0;i {
    /* Send I2C1 data */
    //I2C_SendData(I2C1, pDat[i]);
    STM32_I2c1_Regs->dr.bit.DR=pDat[i];


    /* Test on I2C1 EV8 and clear it */
    // 【TXE=1 数据寄存器空; 写数据DR清除,START,STOP】  BTF="1:" 字节发送结束 TRA="数据已发送"  BUSY="在总线上正在进行数据通讯"  MSL="主模式"
    //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){;} /* EV8 */
    while(!(STM32_I2c1_Regs->sr1.all & I2C_TXE));
 
  }
   /* Send I2C1 STOP Condition */
   //I2C_GenerateSTOP(I2C1, ENABLE);
   STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_STOP;
   while(STM32_I2c1_Regs->sr2.bit.MSL);  //  0:从模式


}//end sub


//=============================================================================
//
//=============================================================================
void I2C_24CXX_Read(u16 nAddr, u8* pDat, u16 nLen)
{
 u16 i = 0;
 /* Enable I2C1 acknowledgement if it is already disabled by other function */
 //I2C_AcknowledgeConfig(I2C1, ENABLE);
        STM32_I2c1_Regs->cr1.bit.ACK=1;   //   ACK:应答使能 1:在接收到一个字节后返回一个应答(匹配的地址或数据)
 
 /* Send I2C1 START condition */
 //I2C_GenerateSTART(I2C1, ENABLE);
        STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_START;
 
 /* Test on I2C1 EV5 and clear it */
 // 【SB=1 起始条件已发送 读SR1,然后写数据DR 清零 】   MSL="1主模式"   BUSY="1" 在总线上正在进行数据通讯 )
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)){;}  /* EV5 */
 while(!(STM32_I2c1_Regs->sr1.bit.SB & I2C_SB)) ;
 
 /* Send 24CXX slave address for write */
 //I2C_Send7bitAddress(I2C1, ADDR_24CXX, I2C_Direction_Transmitter);
 STM32_I2c1_Regs->dr.bit.DR=ADDR_24CXX;


 /* Test on I2C1 EV6 and clear it */
 // 【ADDR=1  地址发送结束;读SR1和SR2来清零 】。  TXE="1" 数据寄存器空 MSL="1" BUSY="1", TRA="1" 数据已发送
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){;} /* EV6 */
 while(!(STM32_I2c1_Regs->sr1.all & I2C_ADDR)) ;
 STM32_I2c1_Regs->sr2.all;
 
 /* Send the low part of memory address */
 //I2C_SendData(I2C1, (u8)nAddr);
 STM32_I2c1_Regs->dr.bit.DR=(u8)nAddr;


 /* Test on I2C1 EV8 and clear it */
 // 【TXE=1 数据寄存器空; 写数据DR清除,START,STOP】  BTF="1:" 字节发送结束 TRA="数据已发送"  BUSY="在总线上正在进行数据通讯"  MSL="主模式"
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){} /* EV8 */
 while(!(STM32_I2c1_Regs->sr1.all & I2C_TXE));
 
 //====================================================================
 //I2C_GenerateSTART(I2C1, ENABLE);
        STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_START;
 
 /* Test on EV5 and clear it */
 // 【SB=1 起始条件已发送 读SR1,然后写数据DR 清零 】   MSL="1主模式"   BUSY="1" 在总线上正在进行数据通讯 )
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)){;}  /* EV5 */
 
 while(!(STM32_I2c1_Regs->sr1.bit.SB & I2C_SB)) ;
 
 /* Send 24CXX slave address for read */
 //I2C_Send7bitAddress(I2C1, ADDR_24CXX, I2C_Direction_Receiver);
  STM32_I2c1_Regs->dr.bit.DR=(u8)ADDR_24CXX|((u8)0x01);


 /* Test on EV6 and clear it */
 // 【ADDR=1  地址发送结束;读SR1和SR2来清零 】。  TXE="1" 数据寄存器空 MSL="1" BUSY="1", TRA="1" 数据已发送
 //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)){;}  /* EV6 */
 
 while(!(STM32_I2c1_Regs->sr1.all & I2C_ADDR)) ;
 STM32_I2c1_Regs->sr2.all;
 
 for(i=0;i {
   if((i+1)>=nLen)
   {
     /* Disable I2C1 acknowledgement */
     //I2C_AcknowledgeConfig(I2C1, DISABLE);
     STM32_I2c1_Regs->cr1.bit.ACK=0;       //   ACK:应答使能   关闭
 
     /* Send I2C1 STOP Condition */
     //I2C_GenerateSTOP(I2C1, ENABLE);
     STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_STOP;
     while(STM32_I2c1_Regs->sr2.bit.MSL);  //  0:从模式 
 
   }
   /* Test on EV7 and clear it */
   // 【RXNE=1  数据寄存器非空; 读写DR清零 】 BUSY="1" 在总线上正在进行数据通讯 MSL="1" 主模式
   //while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)){;}  /* EV7 */
     while(!(STM32_I2c1_Regs->sr1.all & I2C_RXNE)) ;
 
   /* Store I2C1 received data */
   //pDat[i] = I2C_ReceiveData(I2C1);
   pDat[i] = STM32_I2c1_Regs->dr.bit.DR;
 }


}//end sub


关键字:STM32  24C02函数  I2C例程 引用地址:STM32 24C02函数 I2C例程 非STM32库方式

上一篇:STM32作为主机I2C,读写24C02 EEPROM
下一篇:STM32IO及定时器映射到地址

推荐阅读

据外媒报道,科技圈两大巨头苹果与高通之间旷日持久的战争有望在今年达成和解。据悉二者自2017年1月起便打起了技术专利战,17年1月苹果起诉高通,索赔10亿美元,起诉原因为高通的无线芯片技术授权并未公平公正,而高通也在此后反诉苹果的专利侵权,要求苹果禁售iPhone。据高通CEO史蒂夫·莫伦科夫(Steve Mollenkopf)表示,该公司与苹果之间的僵局已经进入...
恩智浦半导体日前正式推出安全精密测距芯片组SR100T,可为下一代支持UWB的移动终端提供量身定制的高精度定位性能。借助SR100T,移动终端将能够与智能门、入口和汽车进行通信,一旦靠近即可将它们开启。智能灯具、智能音箱和任何其他具备UWB传感功能的互联设备能够感知用户在不同房间的移动,智能互联技术也能直观地融入人们的生活。产品亮点全球首个将安全...
微软Surface Pro系列自打推出以来,从设计、功能、体验等方面塑造了Surface系列业内标杆的形象,可以说奠定了它在二合一笔记本市场的领军地位。如今微软Surface Pro系列已经迭代至第七代,第八代新品Surface Pro 8也浮出水面。据Windows Central报道,微软习惯在10月份发布Surface新品,Surface Pro 8原计划在今年秋季正式登场。与其同时发布的Surf...
自2020年下半年以来,半导体市场晶圆短缺问题日益凸显。与此同时,办公、远程教学等终端应用受疫情影响却呈火爆之势,带动通信与计算机产品快速复苏。近日,IDC针对全球半导体市场的行业现状、产业拐点等话题进行了详细解读,并预测2021年半导体市场将增长17.3%,2023年或将出现产能过剩。IDC认为,从供应链现状来看,截至 9 月,专业代工厂已配置好 20...

史海拾趣

问答坊 | AI 解惑

那位老师帮我讲一下电路图我有点不明白

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 振荡器电路中直流电路中两个三极管中间串连的电容器什么作用,电容器不是割断直流吗? …

查看全部问答∨

谁用过TLC5510??

谁用过TLC5510,它的封装是什么?在PCB库里有么?还是 要自己建的,谁有好的资料或是它的封装,麻烦发个 给我 。3Q nbmeixiang21@163.com…

查看全部问答∨

三极管极性判断!

一、 三颠倒,找基极   三极管是含有两个PN结的半导体器件。根据两个PN结连接方式不同,可以分为NPN型和PNP型两种不同导电类型的三极管,测试三极管要使用万用电表的欧姆挡,并选择R×100或R×1k挡位。  假定我们并不知道被测三极管是NPN型还 ...…

查看全部问答∨

请教一个模拟电路中几个器件的作用?

各位,大家好,请教一下大家各问题,这个电路我研究了n多遍,但是还是解决不了里面一些器件的作用,还请各位多多指教。 图中:Q2A1的作用是什么?Q1A1、Q1B1两个管子组成的时电流源么?R5是正反馈电阻么?D1的作用是什么呢?C5的作用是交流正反馈 ...…

查看全部问答∨

防雷器在电源系统中的应用

一、雷电防护基本原理      雷电及其它强干扰对通信系统的致损及由此引起的后里是严重的,雷电防护将成为必需。雷电由高能的低频成份与极具渗透性的高频成份组成。其主要通过两种形式,一种是通过金属管线或地线直接传导雷电致损设备;一种 ...…

查看全部问答∨

linux驱动开发之——device与driver关系趣谈

转载自 yqli520_2006的博客:http://blog.163.com/yqli520_2006/blog/static/50287777200861863946207/ 昨天看到了一则新闻,标题是《家庭主妇都用上了LINUX》,如果在10年前看到这则新闻,我们肯定惊讶不已,会说:“我靠,家庭主妇也他妈用 LINU ...…

查看全部问答∨

请教VHDL--关于双口ram对同一地址单元的读写控制

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY control IS PORT( clk,rest:IN STD_LOGIC;            wradd,rdadd:in std_logic_vector (12 downto 0);        wr,rd:OUT STD_LOGIC ...…

查看全部问答∨

最近跳楼的为什么这么多啊?

北邮的跳了,北科的也跳了,富士康也跳了,这都是为啥呀?。。。…

查看全部问答∨

TI C6000系列DSP Cache优化

大家有谁用过TI C6000系列的DSP, 常用的Cache优化方法,可否介绍一下, 谢谢!…

查看全部问答∨

SOC封装测试中对core的测试时间计算的一个问题

SOC封装测试中对core的测试时间计算的一个问题 流水线的三种不同计算方法:1)各段均取周期法2)最省时法3)各叠加段取最大值法 在各段均取周期法中,流水线时间计算公式:第一条指令的执行时间+(指令条数-1)*周期,周期是指最大的一个阶段。 最 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved