00. 目录

文章目录

  • 00. 目录
  • 01. IIC简介
  • 02. 功能描述
  • 03. 硬件模块
  • 04. 软件设计
  • 05. 结果验证
  • 06. 附录
  • 07. 声明

01. IIC简介

IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。

I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

02. 功能描述

开机的时候先检测24C02是否存在,然后在主循环里面检测两个按键,其中 1 个按键(KEY1)用来执行写入 24C02 的操作,另外一个按键(KEY0)用来执行读出操作,在 TFTLCD 模块上显示相关信息。同时用 DS0 提示程序正在运行。

03. 硬件模块

硬件资源有:
1) 指示灯 DS0
2) KEY_UP 和 KEY1 按键
3) 串口(USMART 使用)
4) TFTLCD 模块
5) 24C02

04. 软件设计

myiic.h

#ifndef __MYIIC_H
#define __MYIIC_H
#include "sys.h" //IO方向设置
#define SDA_IN()  {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;} //PB9输入模式
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;} ////IO操作函数
#define IIC_SCL    PBout(8) //SCL
#define IIC_SDA    PBout(9) //SDA
#define READ_SDA   PBin(9)  //输入SDA //IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口
void IIC_Start(void);               //发送IIC开始信号
void IIC_Stop(void);                //发送IIC停止信号
void IIC_Send_Byte(u8 txd);         //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void);              //IIC等待ACK信号
void IIC_Ack(void);                 //IIC发送ACK信号
void IIC_NAck(void);                //IIC不发送ACK信号void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);
#endif

myiic.c

#include "myiic.h"
#include "delay.h"//初始化IIC
void IIC_Init(void)
{           GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟//GPIOB8,B9初始化设置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化IIC_SCL=1;IIC_SDA=1;
}
//产生IIC起始信号
void IIC_Start(void)
{SDA_OUT();     //sda线输出IIC_SDA=1;       IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1; IIC_SDA=1;//发送I2C总线结束信号delay_us(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN();      //SDA设置为输入  IIC_SDA=1;delay_us(1);    IIC_SCL=1;delay_us(1);   while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;//时钟输出0       return 0;
}
//产生ACK应答
void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
//不产生ACK应答
void IIC_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT();         IIC_SCL=0;//拉低时钟开始数据传输for(t=0;t<8;t++){              IIC_SDA=(txd&0x80)>>7;txd<<=1;      delay_us(2);   //对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2); IIC_SCL=0;    delay_us(2);}
}
//读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++ ){IIC_SCL=0; delay_us(2);IIC_SCL=1;receive<<=1;if(READ_SDA)receive++;   delay_us(1); }                   if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usmart.h"
#include "lcd.h"
#include "rtc.h"
#include "rng.h"
#include "key.h"
#include "wkup.h"
#include "adc.h"
#include "dma.h"
#include "24cxx.h"//要写入到24c02的字符串数组
const u8 TEXT_Buffer[]={"Explorer STM32F4 IIC TEST"};
#define SIZE sizeof(TEXT_Buffer)     int main(void)
{ u8 key;u16 i=0;u8 datatemp[SIZE];    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);    //初始化延时函数uart_init(115200);    //初始化串口波特率为115200LED_Init();                    //初始化LED LCD_Init();                    //LCD初始化 KEY_Init();                //按键初始化  AT24CXX_Init();            //IIC初始化 POINT_COLOR=RED; LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");    LCD_ShowString(30,70,200,16,16,"IIC TEST");   LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,110,200,16,16,"2014/5/6");    LCD_ShowString(30,130,200,16,16,"KEY1:Write  KEY0:Read");    //显示提示信息        while(AT24CXX_Check())//检测不到24c02{LCD_ShowString(30,150,200,16,16,"24C02 Check Failed!");delay_ms(500);LCD_ShowString(30,150,200,16,16,"Please Check!      ");delay_ms(500);LED1=!LED1;//DS0闪烁}LCD_ShowString(30,150,200,16,16,"24C02 Ready!");    POINT_COLOR=BLUE;//设置字体为蓝色   while(1){key=Key_Scan();if(key==KEY1_PRESS)//KEY1按下,写入24C02{LCD_Fill(0,170,239,319,WHITE);//清除半屏    LCD_ShowString(30,170,200,16,16,"Start Write 24C02....");AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE);LCD_ShowString(30,170,200,16,16,"24C02 Write Finished!");//提示传送完成}if(key==KEY0_PRESS)//KEY0按下,读取字符串并显示{LCD_ShowString(30,170,200,16,16,"Start Read 24C02.... ");AT24CXX_Read(0,datatemp,SIZE);LCD_ShowString(30,170,200,16,16,"The Data Readed Is:  ");//提示传送完成LCD_ShowString(30,190,200,16,16,datatemp);//显示读到的字符串}i++;delay_ms(10);if(i==20){LED1=!LED1;//提示系统正在运行  i=0;}         }        }

05. 结果验证

06. 附录

6.1 【STM32】STM32系列教程汇总

网址:【STM32】STM32系列教程汇总

07. 声明

该教程参考了正点原子的《STM32 F4 开发指南》

【STM32】GPIO模拟I2C程序示例相关推荐

  1. GPIO模拟I2C程序实现

    GPIO模拟I2C程序实现. I2C是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称SCL)和SerialData(简称SDA).I2C是总线结构,1个 ...

  2. STM32 通用GPIO模拟I2C实现

    STM32 通用GPIO模拟I2C实现 通用GPIO模拟I2C通信实现样例 1 GPIO初始化 #ifdef HW_I2C1 //硬件I2C初始化//PA8-I2C1_SCLGPIO_StructIn ...

  3. STM32使用模拟I2C读取硒翔30mL流量传感器

    使用模拟I2C读取硒翔30mL/min流量传感器 该工程使用某些采样次数和时间不同会采集到的报文有问题. 我建议是可以换个次数和时间调下. 如果报文有问题的话 就修改延时就好了,延时指的是I2C每发送 ...

  4. Linux I2C子系统分析之(一) ----- 用GPIO模拟I2C总线

    在drivers/i2c/busses下包含各种I2C总线驱动,如S3C2440的I2C总线驱动i2c-s3c2410.c,使用GPIO模拟I2C总线的驱动i2c-gpio.c,这里只分析i2c-gp ...

  5. S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

    目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...

  6. 外设驱动库开发笔记8:GPIO模拟I2C驱动

    I2C总线简单方便,是我们经常使用的一种总线.但有时候我们的MCU没有足够多的I2C控制器来实现我们的应用,所幸我可以使用普通的GPIO引脚来模拟低速的I2C总线通信.这一节我们就来实现使用软件通过普 ...

  7. i2c 驱动五:gpio模拟i2c

    有关linux的i2c相关文章有一下几篇,他们互相关联,应该一同看: - i2c 驱动一:简介 - i2c 驱动二:devfs文件系统 - i2c 驱动三:自己实现设备和驱动分离 - i2c 驱动四: ...

  8. GPIO模拟I2C通信协议(二)

    GPIO模拟2C读写E2PROM 1 E2PROM简介 2 AT24C28的读写逻辑 2.1 单字节写入 (BYTE WRITE) 2.2 页写入 (PAGE WRITE) 2.3 读取当前地址 (C ...

  9. 51单片机模拟I2C程序

    IIC即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦公司研发出来的.是一种两线式串行总线,两条线可以挂多个参与通信的器件,即多机模式.一般由控制器作为主机. ...

最新文章

  1. LIO-SAM: 紧耦合的激光与惯导里程计方案
  2. Android超简单的进度条源码
  3. java socket聊天工具_java+socket 简易聊天工具
  4. 2020-10-27(汇编收获)
  5. 【tensorflow-keras-BatchNormalization】BatchNormalization批量标准化层
  6. java注销对话框_【java小程序实战】小程序注销功能实现
  7. 程序员的幸福感和颈椎病
  8. java 调用dll 方法 postmessage实现后台模拟按键_VB实现模拟键盘及模拟鼠标(后台操作)...
  9. PaaS中OpenShift持久化存储的管理实践
  10. pytorch AUTOGRAD
  11. Java类型转换工具类(十六进制—bytes互转、十进制—十六进制互转,String—Double互转)
  12. (转)Google Fonts 的介绍与使用
  13. 下拉选择框 其他_WPS表格下拉菜单的多种做法(一)
  14. 几何公差之什么是基准要素?基准要素有哪些类型?
  15. Latex如何在文本中插入数学符号
  16. 梵曦诺(莫七七)店铺案例分析
  17. 10部残酷惨烈的要塞攻防电影
  18. 解决Windows Update错误“80072EFD”
  19. HDOJ--1162--Eddy's picture
  20. Linux系统下LightDM详解

热门文章

  1. 关于Android C++的NDK环境搭建(Win7系统)
  2. WINIO64位模拟键鼠操作
  3. 7-6 求一元二次方程 (10 分)
  4. 消费消息删除_【进阶之路】可靠消息最终一致性解决方案
  5. python小结_python简单小结
  6. CSS样式为什么放在head中,而不放在body底部
  7. 聚类算法(五)--层次聚类(系统聚类)及超易懂实例分析
  8. nginx 全局配置
  9. 使用wlan接收器经常重新登录怎么办
  10. 配置Windows下编译运行C/C++过程