STM32F2系列驱动开发——模拟I2C通信

发布者:Lihua521最新更新时间:2021-07-13 来源: eefocus关键字:STM32F2系列  驱动开发 手机看文章 扫描二维码
随时随地手机看文章

简介:一、概述
通过STM32的PC14和PC15管脚来模拟I2C通信,读写I2C接口的器件内部寄存器......


一、概述


通过STM32的PC14和PC15管脚来模拟I2C通信,读写I2C接口的器件内部寄存器,具体定义如下:



#define PIN_SCL GPIO_Pin_14


#define PIN_SDA GPIO_Pin_15



延时函数为μs延时,例如Delay(4)表示延时4μs。


二、Static型函数定义



static __inline void TWI_SCL_0(void) { GPIOC->BSRRH = PIN_SCL; }


static __inline void TWI_SCL_1(void) { GPIOC->BSRRL = PIN_SCL; }


static __inline void TWI_SDA_0(void) { GPIOC->BSRRH = PIN_SDA; }


static __inline void TWI_SDA_1(void) { GPIOC->BSRRL = PIN_SDA; }


static __inline u8 TWI_SDA_STATE(void) { return (GPIOC->IDR & PIN_SDA) != 0; }



三、功能函数定义



void TWI_Init(void);


u8 TWI_Start(void);


u8 TWI_Start_SHT(void);


void TWI_Stop(void);


void TWI_SendByte(u8 Data);


u8 TWI_ReceiveByte(void);


void TWI_SendACK(void);


void TWI_SendNACK(void);


u8 TWI_WaitACK(void);




u8 TWI_WriteOneByte(u8 DAddr,u8 Addr,u8 Dat);


u8 TWI_ReadOneByte(u8 Daddr,u8 Addr);



四、功能函数详解


4.1 I2C端口初始化


说明:(1)SDA设置为开漏输出,这是双向数据线常规I/O方式。


(2)SCL设置为推挽输出



void TWI_Init(void)


{


GPIO_InitTypeDef GPIO_InitStructure;


RCC->AHB1ENR |= 1<<2;


RCC->APB1ENR |= 1<<28;


PWR->CR |= 1<<8;


RCC->BDCR &= ~(1<<0);


GPIO_InitStructure.GPIO_Pin = PIN_SDA;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;


GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;


GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;


GPIO_Init(GPIOC,&GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = PIN_SCL;


GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;


GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;


GPIO_Init(GPIOC,&GPIO_InitStructure);


TWI_SDA_1();


TWI_SCL_0();


}



4.2 I2C发送启动函数



u8 TWI_Start(void)


{


TWI_SDA_1();


TWI_SCL_1();


Delay(4);


if(!TWI_SDA_STATE())//SDAÏßΪµÍµçƽÔò×ÜÏß棬Í˳ö


{


return TWI_FAILURE;


}


TWI_SDA_0();


Delay(4);


while(TWI_SDA_STATE())//SDAÏßΪ¸ßµçƽÔò×ÜÏß³ö´í£¬Í˳ö


{


return TWI_FAILURE;


}


TWI_SCL_0();


Delay(4);


return TWI_SUCCESS;


}



4.3 I2C停止函数



void TWI_Stop(void)


{


TWI_SDA_0();


TWI_SCL_0();


Delay(4);


TWI_SCL_1();


Delay(4);


TWI_SDA_1();


}



4.4 向从机发送应答信号



void TWI_SendACK(void)


{


TWI_SDA_0();


TWI_SCL_0();


Delay(4);


TWI_SCL_1();


Delay(4);


TWI_SCL_0();


}



4.5 发送无应答信号



void TWI_SendNACK(void)


{


TWI_SDA_1();


TWI_SCL_0();


Delay(4);


TWI_SCL_1();


Delay(4);


TWI_SCL_0();


}



4.6 等待从机应答信号



u8 TWI_WaitACK(void)


{


TWI_SCL_0();


TWI_SDA_1();


Delay(4);


TWI_SCL_1();


Delay(4);


while(TWI_SDA_STATE())


{


TWI_SCL_0();


return TWI_FAILURE;


}


TWI_SCL_0();


return TWI_SUCCESS;


}



4.7 发送一字节数据函数



void TWI_SendByte(u8 Data)


{


u8 i=8;




while(i--)


{


TWI_SCL_0();


Delay(1);


if(Data&0x80)


{


TWI_SDA_1();


}


else


{


TWI_SDA_0();


}


Data<<=1;


Delay(4);


TWI_SCL_1();


Delay(4);


}


TWI_SCL_0();


}



4.8 接收一字节数据函数



u8 TWI_ReceiveByte(void)


{


u8 i=8;


u8 Data = 0;


TWI_SDA_1();


while(i--)


{


Data <<= 1;


TWI_SCL_0();


Delay(4);


TWI_SCL_1();


Delay(4);


if(TWI_SDA_STATE())


{


Data |= 0x01;


}


}


TWI_SCL_0();


return Data;


}



五 、应用函数


5.1 向从机按地址写数据



u8 TWI_WriteOneByte(u8 DAddr,u8 Addr,u8 Dat)


{


if(!TWI_Start())


return TWI_FAILURE;


TWI_SendByte(DAddr);


TWI_WaitACK();


TWI_SendByte(Addr);


TWI_WaitACK();


TWI_SendByte(Dat);


TWI_WaitACK();


TWI_Stop();


return TWI_SUCCESS;


}



5.2 从从机按地址读数据



u8 TWI_ReadOneByte(u8 Daddr,u8 Addr)


{


u8 Dat;


if(!TWI_Start())


return TWI_FAILURE;


TWI_SendByte(Daddr);


if(!TWI_WaitACK())


{


TWI_Stop();


return TWI_FAILURE;


}


TWI_SendByte(Addr);


TWI_WaitACK();


TWI_Start();


TWI_SendByte(Daddr + 1);


TWI_WaitACK();


Dat = TWI_ReceiveByte();


TWI_SendNACK();


TWI_Stop();


return Dat;


}



5.3 RTC允许设置函数



u8 RTC_WriteTimeOff(void)


{


if(!TWI_WriteOneByte(DEVICE_ADDRESS_WRITE,0x0F,0x0))


{


return TWI_FAILURE;


}


TWI_WriteOneByte(DEVICE_ADDRESS_WRITE,0x10,0x0);


return TWI_SUCCESS;


}



5.4 RTC禁止设置函数



u8 RTC_WriteTimeOff(void)


{


if(!TWI_WriteOneByte(DEVICE_ADDRESS_WRITE,0x0F,0x0))


{


return TWI_FAILURE;


}


TWI_WriteOneByte(DEVICE_ADDRESS_WRITE,0x10,0x0);


return TWI_SUCCESS;


}



5.5 读实时数据寄存器



u8 TWI_ReadDate(S_Time *psRTC)


{


if(!TWI_Start())


return TWI_FAILURE;


TWI_SendByte(DEVICE_ADDRESS_WRITE+1);


if(!TWI_WaitACK())


{


TWI_Stop();


return TWI_FAILURE;


}


psRTC->Second = TWI_ReceiveByte();


TWI_SendACK();


psRTC->Minute = TWI_ReceiveByte();


TWI_SendACK();


psRTC->Hour = TWI_ReceiveByte()&0x7F;


TWI_SendACK();


psRTC->Week = TWI_ReceiveByte();


TWI_SendACK();


psRTC->Day = TWI_ReceiveByte();


TWI_SendACK();


psRTC->Month = TWI_ReceiveByte();


TWI_SendACK();


psRTC->Year = TWI_ReceiveByte();


TWI_SendNACK();


TWI_Stop();


return TWI_SUCCESS;


}



5.6 写实时数据寄存器



u8 TWI_WriteDate(S_Time SetRTC)


{


S_Time *psRTC;


psRTC = &SetRTC;


RTC_WriteTimeOn();


if(!TWI_Start())


return TWI_FAILURE;


TWI_SendByte(DEVICE_ADDRESS_WRITE);


if(!TWI_WaitACK())


{


TWI_Stop();


return TWI_FAILURE;


}


TWI_SendByte(SECOND_REGISTER_ADDRESS);


TWI_WaitACK();


TWI_SendByte(psRTC->Second);


TWI_WaitACK();


TWI_SendByte(psRTC->Minute);


TWI_WaitACK();


TWI_SendByte(psRTC->Hour | 0x80);


TWI_WaitACK();


TWI_SendByte(psRTC->Week);


TWI_WaitACK();


TWI_SendByte(psRTC->Day);


TWI_WaitACK();


TWI_SendByte(psRTC->Month);


TWI_WaitACK();


TWI_SendByte(psRTC->Year);


TWI_WaitACK();


TWI_Stop();


RTC_WriteTimeOff();


return TWI_SUCCESS;


}



六、总结


本文通过STM32F2系列的单片机读写RTC实时时钟芯片SD2405,设计上完全可行,并已在产品上使用。


关键字:STM32F2系列  驱动开发 引用地址:STM32F2系列驱动开发——模拟I2C通信

上一篇:STM32如何配置使用SPI通信
下一篇:基于STM32F107的搬运机器人电机控制电路设计

推荐阅读最新更新时间:2024-11-06 17:07

日本精机开发出无源驱动单色有机EL面板
  日本精机开发出了分别支持白、红、橙、蓝、绿5色单色显示的无源矩阵型有机EL面板。耗电量均降至该公司原来的白色有机EL面板的1/2以下。该公司2010年3月曾发布过实现低耗电量的绿色单色显示产品,此次追加了其他色彩。。目前技术上已能进行量产,“计划2011年内开始量产”(该公司执行董事、显示器业务部副部长兼显示器营业部长石田富平)。设想用于车载装置、产业设备以及消费类移动产品等广泛用途。   据日本精机介绍,开发品均为0.8英寸、39×96像素。画面尺寸最大可支持2.7英寸。耗电量方面,白色为12mW、红色为7mW、橙色和蓝色均为8mW、绿色为5mW。以上均为假设实际使用时,显示30%的画面时的数据。绿色的耗电量最低、为5mW,
[家用电子]
USB 接口驱动程序开发
     1 引言   随着微机技术水平的日益提高,传统的计算机接口已经不能满足当前计算机高速发展的需求,计算机业迫切需要一种新的通用型、高速总线接口,通用外设接口标准USB 就应运而生。   USB,全称是Universal Serial Bus(通用串行总线),是一种新型的、基于令牌的、高速的串行总线标准,由Compaq、Microsoft、Intel、IBM 等七家公司共同开发的, 旨在解决日益增加的PC 外设与有限的主板插槽和端口之间的矛盾而制定的一种串行通信标准 ,自1995年在Comdex 上亮相以来已广泛地为各PC 厂家支持。   现在市场上几乎所有的P C 机器都配备了US B 接口,USB 接口之所以
[嵌入式]
基于AUTOSAR的电机驱动控制系统开发
1、前言 纯电动汽车和混合动力汽车是新能源汽车产业发展的重要方向,同时,泛亚“电动化、智能化、网联化、数字化”战略的提出,使得未来车载汽车电子电气架构系统的开发越来越复杂。汽车开放系统架构 AUTOSAR 代表的层次化、模块化、平台化技术则是汽车电子软件开发的重要趋势。在电动汽车的三大电控系统中(电机控制、电池管理、整车控制),电机控制作为核心之一,其软件架构的研究设计对于汽车电控系统的开发有重要意义。本报告以电动汽车用驱动电机作为研究对象,以 AUTOSAR 开发架构为基础,对电机驱动控制系统软件架构设计与开发进行探究,并在此基础上对电机过调制控制算法以及旋变软解码技术进行详细研究。 2、电动汽车的电机控制软件基于 AUTO
[嵌入式]
基于AUTOSAR的电机<font color='red'>驱动</font>控制系统<font color='red'>开发</font>
Linux设备驱动开发 - 字符设备驱动
struct cdev结构体: 1 struct cdev { 2 struct kobject kobj; /* 内嵌的kobject对象 */ 3 struct module *owner; /* 所属模块 */ 4 const struct file_operations *ops; /* 文件操作结构体 */ 5 struct list_head list; 6 dev_t dev; /* 设备号 */ 7 unsigned int count; 8 }; struct file_operations原形: 1 struct file_operations { 2 struct mod
[单片机]
Linux设备<font color='red'>驱动</font><font color='red'>开发</font> - 字符设备<font color='red'>驱动</font>
Linux操作系统下的PCI驱动开发
   O 引言   PCI总线是一种成熟的计算机标准总线,而Linux操作系统则是一种源代码公开的操作系统。Linux构架完全沿袭了UNIX的系统架构,它不但拥有UNIX的全部功能,而且具有UNIX稳定、可靠、安全的优点,尤其是Linux加入GNU并遵循公共版权许可证(GPL)之后,几乎所有的GNU软件都可以移植到Linux,从而完善和提高了Linux系统的使用性,并逐步成为通信、工业控制、消费电子等领域的主流操作系统。   本文主要对Linux环境下开发PCI9054芯片驱动的具体方法进行描述,并给出了如何将驱动程序编译进内核,以使驱动模块静态加载的方法。    1 PCI9054简介   PCI总线协议一般需要
[嵌入式]
智能步进电机驱动器支持快速应用开发
在低速下需要大扭矩和精确可靠的定位时,步进电机始终是理想选择。智能解决方案如Trinamic模块和电机及控制系统一体的PANdrive完成了数字和物理世界之间的简单接口。 TRINAMIC Motion Control GmbH&Co. 一家领先的半导体 及运动控制领域电子和机电一体化解决方案的供应商,于2018年2月19日在汉堡自豪地宣布TMCM-1240更加成功扩展了电机可安装模块的业务。 最新的步进电机的驱动技术,包括流行的无声控制模式StealthChop第二代和无传感器依据负载调节电流的CoolStep。磁性SensOstep编码器即使在静止状态下也能提供安全的失步检测。 “15年前,我们率先在市场上推出了智
[工业控制]
基于Linux平台的FPGA驱动开发
    Linux操作系统的全称是GNU/Linux,它是由GNU工程和Linux内核两个部分共同组成的一个操作系统。该系统中所有组件的源代码都是自由的,可以有效保护学习成果,因而在嵌入式领域得到了广泛的应用。     FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,该器件是作为专用集成电路ASIC (Application Specific Integrated Circuit)领域中的一种半定制电路而出现的,它的出现既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。在通信行业、传输网、医疗仪器、各种电子仪器、安防监控、电力系统、汽车电子以及消费类电子中都大
[嵌入式]
日本电产将在苏州设立驱动马达开发中心
2019年10月27日,2019联合国开发计划署中国氢能产业大会*在中国佛山市召开。日本电产车载事业本部长早舩一弥专务执行董事在此次大会上做了演讲。 早舩本部长介绍了日本电产开发的集马达、齿轮箱、逆变器于一体的驱动马达系统(E-Axle)。该产品以小型、轻量、高性能著称,为广汽新能源的电动车“AionS”和“Aion LX” 所采用。 日本电产采用了高槽满率的绕线方法以及双道油冷结构,实现了该产品的小型化和高性能。据早舩本部长介绍,目前,在中国、欧洲采用油冷方式为数不多,而油冷与水冷相比,能使马达体积缩小约 20%。并且,早舩本部长还提到了,FCV(燃料电池汽车)与 BEV(纯电动车)相比,需要燃料电池堆(FC
[工业控制]
日本电产将在苏州设立<font color='red'>驱动</font>马达<font color='red'>开发</font>中心
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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