#ifndef __MYIIC_H_

#define __MYIIC_H_

#include "common.h"

#include "delay.h"

#include "debugserial.h"

//sda 027 scl 028

//IO方向设置

#define IIC1_SDA_IN()  P0dir(27) = 0

#define IIC1_SDA_OUT() P0dir(27) = 1

//IO操作函数

#define IIC1_READ_SDA   P0in(27)    //输入SDA

void my_iic_init(void);                 //初始化IIC的IO口

void my_iic_start(void);                //发送IIC开始信号

void my_iic_stop(void);                 //发送IIC停止信号

void my_iic_sendByte(u8 txd);           //IIC发送一个字节

u8   my_iic_readByte(void); //IIC读取一个字节

u8   my_iic_waitAck(void);              //IIC等待ACK信号

void my_iic_ack(void);                  //IIC发送ACK信号

void my_iic_nAck(void);                 //IIC不发送ACK信号

#endif

#include "myiic.h"

//该驱动针对模拟IIC操作

void my_iic_init(void)                  //初始化IIC的IO口

{

LPC_SC->PCONP |= (1<<15);

LPC_IOCON->P0_27 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P0_27 |= (1<<8);//与引脚配置相关 根据实际引脚进行修改

LPC_IOCON->P0_28 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P0_28 |= (1<<8);//与引脚配置相关 根据实际引脚进行修改

P0dir(27) = 1;//scl输出

P0dir(28) = 1;//sda输出

P0high(27) = 1;//初始化都是高电平

P0high(28) = 1;

}

void my_iic_start(void)             //发送IIC开始信号

{

IIC1_SDA_OUT();     //sda线输出

P0high(27)=1;       //SDA HIGH

P0high(28)=1;       //SCL HIGH

DelayUs(5);

P0low(27)=1;        //SDA LOW

DelayUs(5);

P0low(28)=1;        //SCL LOW

}

void my_iic_stop(void)                  //发送IIC停止信号

{

IIC1_SDA_OUT();     //sda线输出

P0high(28)=1;       //SCL HIGH

P0low(27)=1;        //SDA LOW

DelayUs(5);

P0high(27)=1;       //发送I2C总线结束信号 SDA HIGH

DelayUs(5);

}

void my_iic_sendByte(u8 txd)            //IIC发送一个字节

{

u8 t;

IIC1_SDA_OUT();

for(t=0;t<8;t++)

{

if(((txd&0x80)>>7))

P0high(27) = 1;

else

P0low(27) = 1;

txd<<=1;

P0high(28)=1;   //SCL HIGH

DelayUs(5);

P0low(28)=1;    //SCL LOW

DelayUs(5);

}

}

u8   my_iic_readByte(void)  //IIC读取一个字节

{

unsigned char i,receive=0;

IIC1_SDA_IN();//SDA设置为输入

for(i=0;i<8;i++ )

{

receive<<=1;

P0high(28)=1;           //SCL HIGH

DelayUs(5);

if(IIC1_READ_SDA)receive++;

P0low(28)=1;            //SCL LOW

DelayUs(5);

}

return receive;

}

u8   my_iic_waitAck(void)               //IIC等待ACK信号

{

u8 ucErrTime=0;

IIC1_SDA_OUT();

P0high(27)=1;       //SDA HIGH

DelayUs(5);

IIC1_SDA_IN();              //SDA设置为输入

P0high(28)=1;               //SCL HIGH

DelayUs(5);

while(IIC1_READ_SDA)

{

ucErrTime++;

DelayUs(1);

if(ucErrTime>250)

{

my_iic_stop();

return 1;

}

}

P0low(28)=1;                //时钟输出 SCL LOW

DelayUs(5);

return 0;

}

void my_iic_ack(void)                   //IIC发送ACK信号

{

IIC1_SDA_OUT();

P0low(27)=1;        //SDA LOW

DelayUs(2);

P0high(28)=1;       //SCL HIGH

DelayUs(5);

P0low(28)=1;        //SCL LOW

DelayUs(5);

}

void my_iic_nAck(void)                  //IIC不发送ACK信号

{

IIC1_SDA_OUT();

P0high(27)=1;       //SDA HIGH

DelayUs(2);

P0high(28)=1;       //SCL HIGH

DelayUs(5);

P0low(28)=1;        //SCL LOW

DelayUs(5);

}

lpc1788IO口模拟IIC的更多相关文章

  1. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

     版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...

  2. 用I/O口模拟IIC总线协议遇到的一些问题

    最近做的一个项目,是基于IIC总线通信的传感器系统.由于另外一个传感器使用的是类IIC协议,而不是标准IIC,所以MCU不能与其通信,最后没有办法,只有通过I/O口模拟的方式实现IIC的总线通信.具体 ...

  3. GPIO模拟IIC接口信号质量分析

    信号质量有问题的波形001: 信号质量有问题的波形002: 从上图可以看出,GPIO口模拟的I2C接口,电平都存在半高的情况. 因为I2C的接口是通过GPIO模拟实现的,该时钟信号线SCL内部默认为下 ...

  4. STM32F10X -- 模拟IIC程序

    听说STM32的IIC硬件做的很鸡肋,所以在这里通过模拟的方式实现IIC协议.此程序能成功对AT24C02操作. 程序中的带参数宏 IIC_DELAY(time)的功能是延时time us,在实际中具 ...

  5. STM32 软件模拟 IIC 代码,标准库、HAL库可用

    #ifndef _IIC_H #define _IIC_H #include "stdio.h" #include "stm32f1xx_hal.h" /* 定 ...

  6. C51—模拟IIC总线实现EEPROM存取数据

    a - 什么是IIC总线 -什么是EEPROM -IIC总线的通信格式 模块化设计注解 整体代码 - 什么是IIC总线 IIC总线是同步通信的一种特殊形式,具有接线口少.控制简单.器件封装形式小.通信 ...

  7. stm32软件模拟IIC读取PX4FLOW光流传感器数据

    这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...

  8. MSP430的IO口模拟I2C总线对AT24C25进行读写程序

    功能: 实现MSP430口线模拟I2C总线协议与24C04通信.                                           ** 描述: 主系统工作时钟为12MHz,I2C工 ...

  9. 51单片机GPIO口模拟串口通信

    51单片机GPIO口模拟串口通信 标签: bytetimer终端存储 2011-08-03 11:06 6387人阅读 评论(2) 收藏 举报 本文章已收录于:   分类: 深入C语言(20) 作者同 ...

随机推荐

  1. nagios安装全过程

    Nagios是一个用来监控主机.服务和网络的开放源码软件,可以在发生故障时发送报警短信和邮件,只要Nagios监控的对象发生故障,系统就会自动发送短信到手机上.所以应用十分广泛. Nagios is  ...

  2. Node.js学习 - Install and Configure

    平台:Windows 官网:https://nodejs.org/en/ 下载安装 CMD中运行 1 交互模式 2 命令模式 模块安装 - NPM npm install express #当前目录安 ...

  3. 2016中国大学生程序设计竞赛 - 网络选拔赛 1004 Danganronpa

    Problem Description Chisa Yukizome works as a teacher in the school. She prepares many gifts, which ...

  4. 转:WebDriver(Selenium2) 处理可能存在的JS弹出框

    在自动化测试过程中,有些情况下我们会遇到一些潜在的Javascript弹出框.(即某些条件下才会出现,不是固定出现),然后如果当这种弹出框出现,我们没有加以处理,WebDriver将无法进行下一步的操 ...

  5. 使用log4j无法输出日志

    前段时间在项目的过程中使用log4j来输出日志,但是在一个项目里我明明已经在src/main/resource目录下创建了log4j.properties.具体配置如下: log4j.rootLogg ...

  6. 修改tomcat的get方法的参数长度

    在solr查询中,遇到查询字符串过长,返回错误,在tomcat的conf/server.xml中修改下面的参数即可.加上maxHttpHeaderSize="65536" < ...

  7. di

    dependency inversion依赖反转和dependency inversion依赖注入 di反转指的是不依赖于具体的实现而是依赖于抽象的接口,那么运行应用的main方法里如果创造具体实现的 ...

  8. httpwebrequest 模拟登录 获取cookies 以前的代码,记录备忘!

    2个类,一个基类,一个构建头信息调用类 关于如何获取到post中的内容,你之需要用http抓包工具把你与目标网站的请求信息抓下来后,打开分析下按照抓下来的包中的数 据进行构建就行了 using Sys ...

  9. 何查询SQL Server数据库没有主键的表并增加主键

    SQL Server数据库中,如果一个表没有主键,我们该如何查询呢?本文我们主要就介绍了如何查询数据库中没有主键的表名并为其增加主键的方法,希望能够对您有所帮助. 该功能的实现代码如下: declar ...

  10. MBR区、DBR区、FAT区、DIR区和DATA区的区别

    来自:互联网 磁盘上的数据按照其不同的特点和作用大致可分为5部分:MBR区.DBR区.FAT区.DIR区和DATA区.我们来分别介绍一下: (1)MBR区(主引导扇区) MBR(Main Boot R ...