当前位置:首页 >> 信息与通信 >>

STM32----5----I2C(上)


STM32----5----I2C(上) (
文章发表于:2011-05-09 11:23 I2C 的协议就不讲了,网上多的很,我们关键在于利用 STM32 的 GPIO 模拟出 I2C: I2C.h #ifndef __IIC_H #define __IIC_H #include "stm32f10x_lib.h" /***************

****************************************** - I2C 宏定义: - 软件模拟 I2C 时的管脚,用 PC12 模拟 CLK,用 PC11 模拟 SDA - 所以在应用的时候,要打开 GPIOC 的时钟 *********************************************************/ #define IIC_SCL_PORT #define IIC_SCL_CLK #define IIC_SCL_PIN #define IIC_SDA_PORT #define IIC_SDA_CLK #define IIC_SDA_PIN GPIOC RCC_APB2Periph_GPIOC GPIO_Pin_12 GPIOC RCC_APB2Periph_GPIOC GPIO_Pin_11

/********************************************************* - I2C 宏定义: - SDA 方向设置: - SDA_IN(): 此处是将 SDA 定义为配置为输入模式 - SDA_OUT():此处是将 SDA_OUT 配置为推挽输出模式 说明:这里是配置的快速写法,当然也可以用库函数初始化, 因为 IIC 的 SDA 线,即要作为输入也要作为输出。 *********************************************************/

#define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;} #define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}

/********************************************************* - I2C 宏定义: - I2C 时钟操作: - Set_IIC_SCL: 此处是将 SCL 拉为高电平 - Clr_IIC_SCL: 此处是将 SCL 拉为低电平

- 说明:通过这两个宏定义就可以模拟 IIC 的时钟电平 SCL 的高低变化了 *********************************************************/ #define Set_IIC_SCL {GPIO_SetBits(IIC_SCL_PORT,IIC_SCL_PIN);} #define Clr_IIC_SCL {GPIO_ResetBits(IIC_SCL_PORT,IIC_SCL_PIN);}

/********************************************************* - I2C 宏定义: - I2C 数据线操作: - Set_IIC_SDA: 此处是将 SDA 拉为高电平 - Clr_IIC_SDA: 此处是将 SDA 拉为低电平 - READ_SDA : 此处是读取 SDA 线上的位数据 - 说明:通过这两个宏定义就可以模拟 IIC 的数据线 SDA 电平的高低变化了 *********************************************************/ #define Set_IIC_SDA {GPIO_SetBits(IIC_SDA_PORT,IIC_SDA_PIN);} #define Clr_IIC_SDA {GPIO_ResetBits(IIC_SDA_PORT,IIC_SDA_PIN);} #define READ_SDA (GPIO_ReadInputDataBit(IIC_SDA_PORT, IIC_SDA_PIN))

/********************************************************* - I2C 模拟操作函数的声明: *********************************************************/ //IIC 所有操作函数 void IIC_Init(void); void IIC_Start(void); void IIC_Stop(void); //初始化 IIC 的 IO 口 //发送 IIC 开始信号 //发送 IIC 停止信号

void IIC_Send_Byte(u8 txd); //IIC 发送一个字节 u8 IIC_Read_Byte(unsigned char ack);//IIC 读取一个字节 u8 IIC_Wait_Ack(void); void IIC_Ack(void); void IIC_NAck(void); //IIC 等待 ACK 信号

//IIC 发送 ACK 信号 //IIC 不发送 ACK 信号

/********************************************************* - I2C 外部操作函数的声明: *********************************************************/ void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data); u8 IIC_Read_One_Byte(u8 daddr,u8 addr); #endif

I2C .c #include "i2c.h" #include "delay.h" /*************************************************************************** - 功能描述:STM32f103 模拟 IIC 初始化函数 - 隶属模块:STM32 IIC 操作 - 函数属性:外部,使用户使用 - 参数说明:无 - 返回说明:无 - 函数实现步骤: (1) 配置好模拟 IIC 的 PC11 和 PC12 的引脚状态 (2)并打开时钟 (3)将 SCL 和 SDA 拉为高电平,使总线处于空闲状态 ***************************************************************************/ void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE ); //打开 GPIOC 的时钟

GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(IIC_SCL_PORT, &GPIO_InitStructure); //配置 SCL,也就是 PC12 为推挽输出模式 GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN; GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure); //配置 SDA,也就是 PC11 为浮空输入模式

Set_IIC_SCL; Set_IIC_SDA; //将 SCL 和 SDA 都拉为高电平,表示 IIC 总线处于高电平 } /*************************************************************************** - 功能描述:STM32f103 模拟 IIC 起始信号函数 - 隶属模块:STM32 IIC 操作 - 函数属性:外部,使用户使用

- 参数说明:无 - 返回说明:无 - 函数实现步骤: (1)首先将 SDA 配置为输出 (2)在 SCL 为高电平期间,SDA 有下降沿的变化 ***************************************************************************/ void IIC_Start(void) { SDA_OUT(); Set_IIC_SDA; Set_IIC_SCL; delay_us(4); Clr_IIC_SDA;//START:when CLK is high,DATA change form high to low delay_us(4); Clr_IIC_SCL;//钳住 I2C 总线,准备发送或接收数据 } /*************************************************************************** - 功能描述:STM32f103 模拟 IIC 终止信号函数 - 隶属模块:STM32 IIC 操作 - 函数属性:外部,使用户使用 - 参数说明:无 - 返回说明:无 - 函数实现步骤: (1)首先将 SDA 配置为输出 (2)在 SCL 为高电平期间,SDA 有上升沿的变化 ***************************************************************************/ void IIC_Stop(void) { SDA_OUT();//sda 线输出 Clr_IIC_SCL; Clr_IIC_SDA;//STOP:when CLK is high DATA change form low to high delay_us(4); Set_IIC_SCL; Set_IIC_SDA;//发送 I2C 总线结束信号 delay_us(4); } /*************************************************************************** - 功能描述:STM32f103 模拟 IIC 等待应答函数 //sda 线输出

- 隶属模块:STM32 IIC 操作 - 函数属性:外部,使用户使用 - 参数说明:无 - 返回说明:返回值:1,接收应答失败;0,接收应答成功 - 函数说明: (1)首先将 SDA 配置为输入 (2)如果返回 0,表示接收应答成功;如果为 1,接收应答失败 (3)注意在 IIC_STOP()中 ,将 SDA 置为了输出,所以再满足 250 条件后,产中 IIC 停止线号, 对输出线 SDA 读 SDA 输入值是为 0 的,所以才退出循环。 (4)此函数为 STM32 主机等待从机的 ACK 函数 ***************************************************************************/ u8 IIC_Wait_Ack(void) { u8 ucErrTime=0; SDA_IN(); //SDA 设置为输入

Set_IIC_SDA;delay_us(1); Set_IIC_SCL;delay_us(1); while(READ_SDA) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } Clr_IIC_SCL;//时钟输出 0 return 0; } /*************************************************************************** - 功能描述:STM32f103 模拟 IIC 应答信号函数 - 隶属模块:STM32 IIC 操作 - 函数属性:外部,使用户使用 - 参数说明:无 - 返回说明:无 - 函数实现步骤: (1)首先将 SDA 配置为输出 (2)在 SCL 的一个时钟周期期间,SDA 为低

(3)此函数为 STM32 主机向从机发送 ACK 函数 ***************************************************************************/ //产生 ACK 应答 void IIC_Ack(void) { Clr_IIC_SCL; SDA_OUT(); Clr_IIC_SDA; delay_us(2); Set_IIC_SCL; delay_us(2); Clr_IIC_SCL; } /*************************************************************************** - 功能描述:STM32f103 模拟 IIC 不应答信号函数 - 隶属模块:STM32 IIC 操作 - 函数属性:外部,使用户使用 - 参数说明:无 - 返回说明:无 - 函数实现步骤: (1)首先将 SDA 配置为输出 (2)在 SCL 的一个时钟周期期间,SDA 为高电平 (4)此函数为 STM32 主机不向从机发送 ACK ***************************************************************************/ void IIC_NAck(void) { Clr_IIC_SCL; SDA_OUT(); Set_IIC_SDA; delay_us(2); Set_IIC_SCL; delay_us(2); Clr_IIC_SCL; } /*************************************************************************** - 功能描述:STM32f103 模拟 IIC 发送一个字节函数 - 隶属模块:STM32 IIC 操作 - 函数属性:外部,使用户使用

- 参数说明:无 - 返回说明:无 - 函数实现步骤: (1)首先将 SDA 配置为输出 (2)在 SCL 为低电平期间,置位 SDA 的数据为 0 或者 1,延时后拉高 SCL,取走数据,循环 8 次 ***************************************************************************/ void IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); Clr_IIC_SCL;//拉低时钟开始数据传输 for(t=0;t<8;t++) { //IIC_SDA=(txd&0x80)>>7; if ((txd&0x80)>>7) Set_IIC_SDA else Clr_IIC_SDA; txd<<=1; delay_us(2); Set_IIC_SCL; delay_us(2); Clr_IIC_SCL; delay_us(2); } } /*************************************************************************** - 功能描述:STM32f103 模拟 IIC 发送一个字节函数 - 隶属模块:STM32 IIC 操作 - 函数属性:外部,使用户使用 - 参数说明:ack 用于决定是是否回应 ACK - 返回说明:无 - 函数实现步骤: (1)首先将 SDA 配置为输入 (2)在 SCL 的一个时钟周期后,读 SDA 的数据,保存在 receive 中 (3)读 1 个字节,ack=1 时,发送 ACK,ack=0,发送 nACK ***************************************************************************/ u8 IIC_Read_Byte(unsigned char ack)

{ unsigned char i,receive=0; SDA_IN();//SDA 设置为输入 for(i=0;i<8;i++ ) { Clr_IIC_SCL; delay_us(2); Set_IIC_SCL; receive<<=1; if(READ_SDA)receive++; delay_us(1); } if (!ack) IIC_NAck();//发送 nACK else IIC_Ack(); //发送 ACK return receive; }

上面的函数,把 STM32 作为主机时 I2C 的功能已经全部描述了出来,至于操作什么 I2C 器件,那就需要该 I 2C 的驱动函数了。


相关文章:
STM32F103C8T6脚位分布
STM32F103 1 VBAT 2 PC13-ANTI_TAMP 3 PC14-OSC32_IN 4 PC15-OSC32_OUT 5 PD0 OSC_IN 6 PD1 OSC_OUT 7 NRST 8 VSSA 9 VDDA 10PA0-WKUP/USART2_...
解决STM32 I2C接口死锁在BUSY状态的问题
解决STM32 I2C接口死锁在BUSY状态的问题_电子/电路_工程科技_专业资料。STM32F...STM32---5---I2C(上) 8页 1下载券 关于STM32 I2C的理解 2页 免费 ...
STM32----6----I2C读写AT24C02
STM32---3---PWM STM32---4---EXTI STM32---5---I2C(上) STM32---7---SPI通信(... STM32---8---SPI(下)与... STM32---9---红外遥控....
STM32用GPIO模拟IIC(I2C)通讯c语言源码-实测可用
STM32用GPIO模拟IIC(I2C)通讯c语言源码-实测可用_计算机软件及应用_IT/计算机_...(5); #else IIC_Start(); //起始信号 IIC_SendByte(SlaveAddress); //...
一个稳定可靠的STM32 I2C程序
一个稳定可靠的STM32 I2C程序_电子/电路_工程科技_专业资料。我自己亲自调试的...(I2C_FLAG_TXE, SET, I2Cx_FLAG_TIMEOUT, 5); /* Prepare the register ...
STM322C硬件bug
(5)Programming the bit NOSTRETCH=0 in the I2C_CR1 register. 这样也 可避免一个 STM32 I2C 硬件设计的一个小 BUG(2。9。5) (6)大部分的 MCU 的...
STM32F4 IIC的一些使用经验
(7) 微雪的 STM32F407 开发板+友善之背的 wifi 模块 SDWIFI-YS09 测试(6) 简单的套接字发送数据包(5) arm-none-linux-gnueabi-gcc 版本下载(4) windows...
stm32几种模式的理解
5、GPIO 口的配置具有上锁功能,当配置好 GPIO 口后,可以通过程序锁住配置组合,...(不同的功能对应同一管脚) STM32 所有内置外设的外部引脚都是与标准 GPIO ...
STM32-考点完整版
5)编写中断服务函数。 6)编写中断服务函数。 8.什么是 STM32 的 RTC?试简述 STM32 的 3.STM32F103RTC6 拥有哪些资源?P11 RTC 具有哪些功能?P196 : 64KB ...
基于STM32F103的I2C总线EEPROM的读写(带超时检测)
基于STM32F103的I2C总线EEPROM的读写(带超时检测)_...{ retry = 5; // 已经试了 5 次,读下一个...(EEPROM 设备地址) I2C_EVENT_MASTER_TRANSMITTER_...
更多相关标签:
stm32 i2c 上拉电阻 | stm32 i2c | stm32 模拟i2c | stm32 i2c例程 | stm32 i2c dma | stm32 i2c bug | stm32 硬件i2c例程 | stm32 硬件i2c |