lpc1788IO口模拟IIC
#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的更多相关文章
- 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...
- 用I/O口模拟IIC总线协议遇到的一些问题
最近做的一个项目,是基于IIC总线通信的传感器系统.由于另外一个传感器使用的是类IIC协议,而不是标准IIC,所以MCU不能与其通信,最后没有办法,只有通过I/O口模拟的方式实现IIC的总线通信.具体 ...
- GPIO模拟IIC接口信号质量分析
信号质量有问题的波形001: 信号质量有问题的波形002: 从上图可以看出,GPIO口模拟的I2C接口,电平都存在半高的情况. 因为I2C的接口是通过GPIO模拟实现的,该时钟信号线SCL内部默认为下 ...
- STM32F10X -- 模拟IIC程序
听说STM32的IIC硬件做的很鸡肋,所以在这里通过模拟的方式实现IIC协议.此程序能成功对AT24C02操作. 程序中的带参数宏 IIC_DELAY(time)的功能是延时time us,在实际中具 ...
- STM32 软件模拟 IIC 代码,标准库、HAL库可用
#ifndef _IIC_H #define _IIC_H #include "stdio.h" #include "stm32f1xx_hal.h" /* 定 ...
- C51—模拟IIC总线实现EEPROM存取数据
a - 什么是IIC总线 -什么是EEPROM -IIC总线的通信格式 模块化设计注解 整体代码 - 什么是IIC总线 IIC总线是同步通信的一种特殊形式,具有接线口少.控制简单.器件封装形式小.通信 ...
- stm32软件模拟IIC读取PX4FLOW光流传感器数据
这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...
- MSP430的IO口模拟I2C总线对AT24C25进行读写程序
功能: 实现MSP430口线模拟I2C总线协议与24C04通信. ** 描述: 主系统工作时钟为12MHz,I2C工 ...
- 51单片机GPIO口模拟串口通信
51单片机GPIO口模拟串口通信 标签: bytetimer终端存储 2011-08-03 11:06 6387人阅读 评论(2) 收藏 举报 本文章已收录于: 分类: 深入C语言(20) 作者同 ...
随机推荐
- Login 和 Logout
inux下Login和Logout详解 Login 是你用Linux系统工作时面对的第一个进程,这对于使用终端以及通过网络使用Linux都是正确的.但是login进程本身 ...
- Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图
Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图 分类: OpenCV图像处理2013-02-21 21:35 6459人阅读 评论(8) 收藏 举报 原文链接 ht ...
- 新建aix实例
http://www.cnblogs.com/kfarvid/archive/2010/12/21/1912553.html DB2数据库 http://wenku.baidu.com/view/ ...
- [转]Android 如何对sqlite数据库进行增删改[insert、update和delete] 操作
import android.content.ContentValues; import android.content.Context; import android.database.Cursor ...
- list遍历
一.对List的遍历有三种方式 List<String> list = new ArrayList<String>(); ...
- HDU - 1865 1string(大数)
题目链接:http://acm.hust.edu.cn/vjudge/contest/121397#problem/F http://acm.hdu.edu.cn/showproblem.php?pi ...
- Junit单元测试的简单使用(主要是在spring框架下的项目)
首先是解释什么是单元测试,单元测试是指对于一个大型项目里,对于单一模块或者单一接口的测试. 然后解释为什么要写单元测试,首先对于一个大型的项目,如果你每次都要重启一遍服务器调页面或者接口的bug,那就 ...
- php五大运行模式CGI,FAST-CGI,CLI,ISAPI,APACHE模式浅谈
做 php 开发的应该都知道 php 运行模式概念吧,本文将要和大家分享的是关于php目前比较常见的五大运行模式:包括cgi .fast-cgi.cli.isapi.apache模块的DLL ,下面作 ...
- 使用C语言扩展Python
开发环境:Ubuntu9.10,python2.6,gcc4.4.1 1,ubuntu下的python运行包和开发包是分开的,因此需要在新利得里面安装python-all-dev,从而可以在代码中引用 ...
- 手机端android/iPhone问题
iPhone: 不能自动播放音乐, 去除默认样式 input:-webkit-appearance: none;border-radius:0px; video播放自动默认全屏解决-webkit-pl ...