STM32F10X -- 模拟IIC程序
听说STM32的IIC硬件做的很鸡肋,所以在这里通过模拟的方式实现IIC协议。此程序能成功对AT24C02操作。
程序中的带参数宏 IIC_DELAY(time)的功能是延时time us,在实际中具体场合具体分析。
宏定义文件--IIC.h
- #ifndef _IIC_
- #define _IIC_
- #include "SysTick.h"
- #include "stm32f10x.h"
- #include "SystemConfig.h"
- /* 配置IIC的SDA、SCL两个端口 */
- #define IIC_SCL_IO GPIO_Pin_6
- #define IIC_SDA_IO GPIO_Pin_7
- /* SDA端口动态改变输入输出状态定义 */
- #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X80000000;} //配置上拉输入
- #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X30000000;} //配置推挽输出
- /* IIC 操作定义 */
- #define IIC_SDA PBOUT(7) //定义的STM32位操作
- #define READ_SDA PBIN(7)
- #define IIC_SCL PBOUT(6)
- #define IIC_DELAY(time) delay(time)
- /* 定义的函数原型 */
- void IIC_IOInit(void);
- void IIC_Start(void);
- void IIC_Stop(void);
- unsigned char IIC_Wait_Ack(void);
- void IIC_NoAck(void);
- void IIC_Ack(void);
- void IIC_Send_Byte(unsigned char txd);
- unsigned char IIC_Read_Byte(unsigned char ack);
- #endif
程序源文件IIC.c文件
- #include "IIC.h"
- /*********************************************************************
- ** STM32模拟IIC通信
- ** 文件编码: GBK2312
- **********************************************************************/
- /*****************************
- ** 初始化IIC的IO口
- **
- ******************************/
- void IIC_IOInit(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE ); //使能IO口时钟
- GPIO_InitStructure.GPIO_Pin = IIC_SCL_IO | IIC_SDA_IO;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_SetBits(GPIOB,IIC_SCL_IO | IIC_SDA_IO); //置位SDA,SCL
- }
- /*****************************
- ** 起始信号
- **
- ******************************/
- void IIC_Start(void)
- {
- SDA_OUT(); //sda 线输出
- IIC_SDA=1;
- IIC_SCL=1;
- IIC_DELAY(4);
- IIC_SDA=0;//当时钟线为高时,SDA拉低则起始信号才有效
- IIC_DELAY(4);
- IIC_SCL=0;//钳住 I2C 总线,准备发送或接收数据
- }
- /*****************************
- ** 停止信号
- **
- ******************************/
- void IIC_Stop(void)
- {
- SDA_OUT();//sda 线输出
- IIC_SCL=0;
- IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
- IIC_DELAY(4);
- IIC_SCL=1;
- IIC_DELAY(1);
- IIC_SDA=1;//发送 I2C 总线结束信号
- IIC_DELAY(4);
- }
- /*****************************
- ** 等待应答信号
- ** 返回值: 1-接收应答失败, 0-为接收成功
- ******************************/
- unsigned char IIC_Wait_Ack(void)
- {
- unsigned char ucErrTime=0;
- SDA_IN(); //SDA 设置为输入
- IIC_SDA=1;IIC_DELAY(1);
- IIC_SCL=1;IIC_DELAY(1);
- while(READ_SDA) //判断SDA上是否有低电平发生
- {
- ucErrTime++;
- if(ucErrTime>250) //如果在一段时间内没有接收到应答信号,则发送停止信号
- {
- IIC_Stop();
- return 1;
- }
- }
- IIC_SCL=0;//时钟输出 0
- return 0;
- }
- /*****************************
- ** 产生应答信号
- **
- ******************************/
- void IIC_Ack(void)
- {
- IIC_SCL=0;
- SDA_OUT();
- IIC_SDA=0;
- IIC_DELAY(2); //数据改变有效
- IIC_SCL=1;
- IIC_DELAY(2);
- IIC_SCL=0;
- }
- /*****************************
- ** 不产生应答信号
- **
- ******************************/
- void IIC_NoAck(void)
- {
- IIC_SCL=0;
- SDA_OUT();
- IIC_SDA=1;
- IIC_DELAY(2);
- IIC_SCL=1;
- IIC_DELAY(2);
- IIC_SCL=0;
- }
- /*****************************
- ** 发送一个字节的数据
- **
- ******************************/
- void IIC_Send_Byte(unsigned char txd)
- {
- unsigned char t;
- SDA_OUT();
- IIC_SCL=0;//拉低时钟开始数据传输,时SDA上的数据改变有效
- for(t=0;t<8;t++)
- {
- IIC_SDA=(txd&0x80)>>7;
- txd<<=1;
- IIC_DELAY(2); //对 TEA5767 这三个延时都是必须的
- IIC_SCL=1;
- IIC_DELAY(2); //保持数据一段时间
- IIC_SCL=0;
- IIC_DELAY(2);
- }
- }
- /*****************************
- ** 读一个字节的数据
- ** 形式参数:ack=1,发送ACK, ack=0,发送NACK
- ******************************/
- unsigned char IIC_Read_Byte(unsigned char ack)
- {
- unsigned char i,receive=0;
- SDA_IN();//SDA 设置为输入
- for(i=0;i<8;i++ )
- {
- IIC_SCL=0;
- IIC_DELAY(2);
- IIC_SCL=1;
- receive<<=1;
- if(READ_SDA)receive++;
- IIC_DELAY(1);
- }
- if (!ack)
- IIC_NoAck();//发送 nACK
- else
- IIC_Ack(); //发送 ACK
- return receive;
- }
STM32F10X -- 模拟IIC程序的更多相关文章
- stm32软件模拟IIC读取PX4FLOW光流传感器数据
这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...
- 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...
- 模拟IIC总线多设备挂载(12864OLED屏幕+GY30光照传感器)
最终效果展示 OLED屏幕和GY30光照传感器(BH1750FVI)都连接在一个IIC(I2C)总线上,所以只需要接4根线即可.获取到的光照强度可以在OLED上实时显示并通过串口打印.IIC是IO模拟 ...
- C51—模拟IIC总线实现EEPROM存取数据
a - 什么是IIC总线 -什么是EEPROM -IIC总线的通信格式 模块化设计注解 整体代码 - 什么是IIC总线 IIC总线是同步通信的一种特殊形式,具有接线口少.控制简单.器件封装形式小.通信 ...
- GPIO模拟IIC接口信号质量分析
信号质量有问题的波形001: 信号质量有问题的波形002: 从上图可以看出,GPIO口模拟的I2C接口,电平都存在半高的情况. 因为I2C的接口是通过GPIO模拟实现的,该时钟信号线SCL内部默认为下 ...
- Chipscope 仿真VmodCAM IIC程序
Chipscope 仿真VmodCAM IIC程序: 目的:熟悉EDK中建立chipscope 注意:zedboard使用digilent USB下载时,chipscope不能和SDK同时使用,否则芯 ...
- lpc1788IO口模拟IIC
#ifndef __MYIIC_H_ #define __MYIIC_H_ #include "common.h" #include "delay.h" #in ...
- [15单片机] STC15F104W开发入门及模拟串口程序
STC15F104W开发入门及模拟串口程序 Saturday, 31. March 2018 09:42AM - beautifulzzzz 前言 最近找到一款51内核的SOP8封装的8脚单片机STC ...
- STM32 软件模拟 IIC 代码,标准库、HAL库可用
#ifndef _IIC_H #define _IIC_H #include "stdio.h" #include "stm32f1xx_hal.h" /* 定 ...
随机推荐
- 201521123068《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 点击->面向对象学习 2. 书面作业 1.clone ...
- 201521123073《Java程序设计》第4周学习总结
一. 本周学习总结 二. 书面作业 1.注释的应用 2.面向对象设计(大作业1,非常重要) 2.1 将在网上商城购物或者在班级博客进行学习这一过程,描述成一个故事.(不得少于50字,参考QQ群中PPT ...
- 201521123066 《Java程序设计》第十四周学习总结
1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) - ...
- latch session allocation
应用反馈上午10点左右出现大量应用连接数据库报错 采集9点-10点和10点-11点的AWR报告进行分析 DB时间明显差异,再继续分析等待事件 可以看出有session相关的Latch等待事件,查看相关 ...
- js的原型
在讲js的原型之前,必须先了解下Object和Function. Object和Function都作为JS的自带函数,Object继承自己,Funtion继承自己,Object和Function互相是 ...
- mongoose api 图表整理
一.背景 今天看 mongoose 的基础 API,参考了下面的链接做了图表以供查阅. 参考资料: http://www.cnblogs.com/xiaohuochai/p/7215067.html ...
- 利用ADO让普通人用excel读取oracle数据库表的通用办法
Ref:http://blog.csdn.net/iamlaosong/article/details/8465177 Excel通过ADO方式连接到Oracle并操作Oracle给那些编程能力不强的 ...
- Extjs2.0 desktop 动态创建桌面图标和开始菜单
这几天一直纠结Extjs desktop怎么动态读取数据,用Ext.net已经实现但是不灵活.Ext.net做出来的桌面在窗口关闭后只是隐藏该窗口,并没有释放,对于我这种js菜鸟来说,改那一坨代码要人 ...
- const在c和c++中的不同
最近开始由学习c转到c++:从面向过程到面向对象的转变中,总是以面向过程的思路思考,发现有很多的不同,今天就稍微发表一下我的见解,如果那里出错,希望大神可以帮忙指出来. 首先是const : 在C语法 ...
- Linux Ubuntu从零开始部署web环境及项目 -----部署项目 (三)
上一篇讲了如何在linux搭建web环境,这边将如何部署项目. 1,打包项目包 2,上传项目包 将.war项目包通过xftp上传到tomcat目录wabapps目录下 3,启动项目 通过xshell命 ...