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

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 的驱动函数了。


相关文章:
一个稳定可靠的STM32 I2C程序
一个稳定可靠的STM32 I2C程序_电子/电路_工程科技_专业资料。我自己亲自调试的...(I2C_FLAG_TXE, SET, I2Cx_FLAG_TIMEOUT, 5); /* Prepare the register ...
STM32F4 IIC的一些使用经验
(7) 微雪的 STM32F407 开发板+友善之背的 wifi 模块 SDWIFI-YS09 测试(6) 简单的套接字发送数据包(5) arm-none-linux-gnueabi-gcc 版本下载(4) windows...
基于STM32F103的I2C总线EEPROM的读写(带超时检测)
基于STM32F103的I2C总线EEPROM的读写(带超时检测)_...{ retry = 5; // 已经试了 5 次,读下一个...(EEPROM 设备地址) I2C_EVENT_MASTER_TRANSMITTER_...
STM32输入输出模式理解
STM32 输入输出模式理解最近在看数据手册的时候,发现在 Cortex-M3 里,对于 ...(5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_...
STM32系列常见问答集锦
5STM32 串口接收程序 问: 在 STM32 串口接收程序里 USART_GetFlagStatus(...(u32)&Escalator8bit; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;...
STM32各种函数的基本配置
STM32F4-Discovery board STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); //Turn on LED4 and...
stm32用硬件i2c读取16位AD:ADS1115
(GPIOD, &GPIO_InitStructure); //配置以上三句.PD5 txd GPIO_InitStructure...STM32---6---I2C读写A... 7页 1下载券 STM32笔记之七:让它跑起... ...
STM32 I2C
应答信号(ACK)和非应答信号(NACK) I2C 总线协议标准规定,发送器每发送一个字节...stm32通过硬件i2c通信的... 6页 5下载券 喜欢此文档的还喜欢 关于...
stm32电子指南针
stm32电子指南针_电子/电路_工程科技_专业资料。《 小型智能电子终端 》 课程...(5) 分析结果,独立撰写设计总结报告陈述自己的观点,格式应严格遵守学校规范。...
stm32几种模式的理解
5、GPIO 口的配置具有上锁功能,当配置好 GPIO 口后,可以通过程序锁住配置组合,...(不同的功能对应同一管脚) STM32 所有内置外设的外部引脚都是与标准 GPIO ...
更多相关标签:
stm32 i2c上拉电阻 | stm32 i2c | stm32模拟i2c | stm32 i2c例程 | stm32f103 i2c例程 | stm32 i2c bug | stm32f103 i2c | stm32f103模拟i2c例程 |