历史上的今天

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

正在发生

2018年09月11日 | STM32中I2C总线上数据的读、写。

发布者:reaper2009 来源: eefocus关键字:STM32  I2C总线  数据 手机看文章 扫描二维码
随时随地手机看文章


/**

  * @brief  从I2C1总线上的某一器件的某一起始地址中读取一定字节的数据到数组中

  * @param  driver_Addr:I2C器件地址

  * @param  start_Addr:起始字节地址

  * @param  number_Bytes:要读取的字节数量(小于一页)

  * @param  read_Buffer:存放读取数据的数组指针

  * @retval 是否读取成功

  */

u8 I2C1_Read_NBytes(u8 driver_Addr, u8 start_Addr, u8 number_Bytes, u8 *read_Buffer)

{

  uint8_t read_Num;

  u8 I2C_Timeout;

  

  I2C_Timeout = 200;

  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET)

  {

    if((I2C_Timeout--) == 0)

    {

      return 1;

    }

  }

  I2C_TransferHandling(I2C1, driver_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);  //I2C_No_StartStop I2C_Generate_Start_Write

  I2C_Timeout = 200;

  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET)

  {

    if((I2C_Timeout--) == 0)

    {

      return 1;

    }

  }

  

  I2C_SendData(I2C1, start_Addr);

  I2C_Timeout = 200;

  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TC) == RESET)

  {

    if((I2C_Timeout--) == 0)

    {

      return 1;

    }

  }  

 

  

  I2C_TransferHandling(I2C1, driver_Addr, number_Bytes,  I2C_AutoEnd_Mode, I2C_Generate_Start_Read);

  

  for(read_Num = 0; read_Num

  {

    I2C_Timeout = 200;

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET)

    {

      if((I2C_Timeout--) == 0)

      {

        return 1;

      }

    }      

    read_Buffer[read_Num] = I2C_ReceiveData(I2C1);

  }  

  I2C_Timeout = 200;

  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET);

  {

    if((I2C_Timeout--) == 0)

    {

      return 1;

    }

  }

 

  return 0;

}


u8 I2C1_Write_NBytes(u8 driver_Addr, u8 start_Addr, u8 number_Bytes, u8 *write_Buffer)

{

  u8 write_Num;

  u8 I2C_Timeout;

  

  I2C_Timeout = 200;

  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET)

  {

    if((I2C_Timeout--) == 0)

    {

      //I2C_ClearFlag(I2C1, I2C_FLAG_BUSY);

      return 1;

    }

  }

  I2C_TransferHandling(I2C1, driver_Addr, number_Bytes+1, I2C_AutoEnd_Mode, I2C_Generate_Start_Write);

  I2C_Timeout = 200;

  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET)

  {

    if((I2C_Timeout--) == 0)

    {

      return 1;

    }

  }

  

  I2C_SendData(I2C1, start_Addr);

  //while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);

 

  //I2C_TransferHandling(I2C1, driver_Addr, number_Bytes, I2C_AutoEnd_Mode, I2C_No_StartStop);  

  for(write_Num = 0; write_Num

  {

    I2C_Timeout = 200;

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET)

    {      

      if((I2C_Timeout--) == 0)

      {

        return 1;

      }

    }

    I2C_SendData(I2C1, write_Buffer[write_Num]);    

  }

 

  I2C_Timeout = 200;

  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET)

  {

    if((I2C_Timeout--) == 0)

    {

      return 1;

    }

  }

 

  return 0;

}


关键字:STM32  I2C总线  数据 引用地址:STM32中I2C总线上数据的读、写。

上一篇:STM32学习笔记之EXTI(外部中断)
下一篇:STM32F030控制蜂鸣器定时响和控制LED亮

推荐阅读

一:STM32F030控制蜂鸣器定时响(1)main.c中:u16 StartTime=0;void main(){ StartTime=500;//蜂鸣器响的时长 SPEEK(1); } void SPEEK(u8 num){ TIM_Cmd(TIM2, ENABLE); //开启时钟}(2)hardware_conf.h中:#define Speak(tmp) GPIOB->ODR=tmp?(GPIOB->ODR|1<<8):(GPIOB->ODR&(~(1<<8)))(3)stm32f10x_it.c中:extern void SPEEK(u8 num...
新能源汽车虽然在国内卖的并不贵,但是换个电池却贵的吓人,所以说,新能源汽车的电池真的是环保的吗? 通过查询汽车网站,可知该款长城C30 EV的综合续航为270Km,新车指导价为15-15.4万元,按照当年的补贴方案,终端售价区间为8.6-9.0万元。另外长城对电池有8年质保政策,目前并不清楚为何该车主被拒保。 有消息指出,事故车的底盘曾发生磕碰,可能...
在拜访我们的一个SDA客户时再次发现了这个问题:示波器的地没有和被测物的地直接相连,用万用表的交流档来测量两个地之间的压差,交流压差有110V!这种情况会瞬间损坏差分探头!客户对于我的发现很是感谢,并兴奋地拿相机拍下了110V作为“证据”。 在浮地情况下,110V的交流压差作为共模电压直接加在探头上,而差分探头的共模电压范围只有几V! 这次的案...
智东西(公众号:zhidxcom)作者 | 健恩编辑 | 云鹏智东西9月11日报道,昨天,世界机器人大会再次在北京亦庄拉开帷幕,智东西记者一大早便跨越整个北京城来到这里打探这场大会的最新消息。世界机器人大会自2015年开始举办,迄今为止已成功举办过5次。它不仅是国内一年一度规模最大的机器人产业顶级展会,也是国内机器人产业风向的集中展示。智东西了解...

史海拾趣

问答坊 | AI 解惑

关于matrix键盘中#的问题

大家新年快乐! 我的平台是pxa270+wince5.0. 现在键盘驱动遇到了一点小问题,请大家帮帮忙。 通常键盘上,shift+3应该是显示#号,但是我目前要做的shift+3要显示欧元符号,#被移到其他按键上去了。 我修改了键盘的影射结构,将原来#的位置用欧 ...…

查看全部问答∨

tl16c554

请问高手,两片tl16c554如何和DSP 连接呢?…

查看全部问答∨

ARM LCD控制寄存器问题

根据时序要求,我们设定VM/VDEN信号作LCD的ENAB信号,VCLK信号作LCD的NCLK信号。要想得到合适的VM和VCLK波形,就要正确设定寄存器的值,根据寄存器的值与VM和VCLK波形的关系,我们设定了如下关键寄存器的值: HSPW=10;HBPD=100;HFPD=47; VSPW=1;VBPD=37 ...…

查看全部问答∨

关于三菱FX2n-1PG的问题!

1PG的#18#17位置设置(1)的设置范围是“0到正负999999”,如果我的伺服驱动器设定每转输入100000个脉冲,那么我能让电机旋转的圈数最多只有9圈多?比如我要电机转15圈,那么每转脉冲数乘以旋转圈数(100000*15=1500000)就超出了设定范围了!如果 ...…

查看全部问答∨

6通道与单通道球幕投影系统介绍与比较

6通道(即5+1)球幕投影系统主要是利用投影融合技术、曲面变形处理技术、多机同步技术,通过6台投影机精准定位投影实现的,属于投影类工程项目(以下简称6通道)。     单通道系列数字天象仪主要依靠投影机,球面镜头、计算机和国际规范 ...…

查看全部问答∨

请教一个分频的问题

我的FPGA用的是40MHz的晶振,利用分频产生100Hz的方波信号,但是示波器输出波形高频成分相当的大!然后又用了FPGA自带的锁相环,但是情况还是那样!不知道这些高频毛刺为啥那么多啊?…

查看全部问答∨

求购 触摸板和EXP430FR5739实验板

本帖最后由 ddllxxrr 于 2016-1-7 16:58 编辑 求购 触摸板和EXP430FR5739实验板  价格不讨太贵。 本站强荐:185娱乐ヲ城.足球ヲ真_人.彩票齐全ヲ手机可投ヲ注任何游戏. 首次开户送10元.首存送58元.信誉绝对保证185.cc …

查看全部问答∨

LED 散热设计原理及结温等相关技术参数的计算公式

LED 散热设计原理及结温等相关技术参数的计算公式 [ 本帖最后由 qwqwqw2088 于 2012-7-23 09:27 编辑 ]…

查看全部问答∨

mega128 HC595 驱动四位一体数码管

这是我的程序#include<iom128v.h> #define SS                                0 #define SCK                & ...…

查看全部问答∨

智能引领未来

智能家居涉及到家居内部的安全问题,很多开发板虽然功能很强大,但在安全稳定性 方面还是有一定的缺陷,而瑞萨开发板多用于汽车内,其稳定性也比其他的好很多。 瑞萨RL78/G13的MCU运作 电流为70μA/MHz(以32MHz进行基本操作),一般作业的待机电流 ...…

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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