LPC1788的IIC使用
#ifndef __IIC0_H_
#define __IIC0_H_
#include "common.h"
#include "delay.h"
//IIC通讯过程中的指定状态
#define STATUS_SENDSTART 0X08 //已经发送起始条件
#define STATUS_REPEATSTART 0X10 //已经发送重复的起始条件
#define STATUS_SENDSLAVE_ACK 0X18 //已发送从机写地址,接收到ACK
#define STATUS_SENDSLAVE_NACK 0X20 //已发送从机写地址,未接收到ack
#define STATUS_SENDDATA_ACK 0X28 //已发送从机写数据,并接收到ack
#define STATUS_SENDDATA_NACK 0X30 //已发送从机写数据没收到ack
#define STATUS_LOSS 0X38 //丢失总线仲裁
#define STATUS_READADDR_NACK 0X48 //已经发送从机读地址未收到ack
#define STATUS_READADDR_ACK 0X40 //已发送从机读地址并接受到ack
#define STATUS_RECV_ACK 0X50 //已接受数据字节ack已返回
#define STATUS_RECV_NACK 0X58 //已接受数据字节nack已返回
void iic0_init(u16 div);//参数为时钟分频数 不得超过65535 + 65535
u8 iic0_start(void);//发送起始信号
u8 iic0_send_write_addr(u8 addr);//发送设备写地址
u8 iic0_send_data(u8 data);//发送数据
u8 iic0_send_stop(void);//发送停止
u8 iic0_send_read_addr(u8 addr);//发送读地址
u8 iic0_read_data(u8* value,u8 ack);//读取数据
u8 iic0_repeat_start(void);//重新发送start
#endif
#include "iic0.h"
#define I2EN 6 //接口使能
#define STA 5 //起始标志
#define STO 4 //停止标志
#define SI 3 //中断标志
#define AA 2 //应答标志
#define I2ENC 6 //清除iic使能
#define STAC 5 //清除起始
#define SIC 3 //清除中断
#define AAC 2 //清除应答
#define STATE (LPC_I2C0->STAT & 0xf8) //IIC总线的实际状态信息
void iic0_init(u16 div)
{
//打开时钟,同时打开iic和gpio时钟
LPC_SC->PCONP |= (1<<15)|(1<<7);//打开时钟
//配置引脚功能
LPC_IOCON->P0_27 = 0x00;
LPC_IOCON->P0_27 |= (1<<0)|(1<<8);//打开iic功能,禁止滤波器 与引脚配置相关 根据实际引脚进行修改
LPC_IOCON->P0_28 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽
LPC_IOCON->P0_28 |= (1<<0)|(1<<8);//打开iic功能,禁止滤波器 与引脚配置相关 根据实际引脚进行修改
LPC_I2C0->CONCLR |= (1<<I2ENC);//首先禁止IIC接口
LPC_I2C0->CONCLR |= (1<<AAC)|(1<<SIC)|(1<<STAC);//清除应答,中断,起始标志
LPC_I2C0->SCLH = div/2;//设置IIC时钟
LPC_I2C0->SCLL = div/2;
LPC_I2C0->CONSET |= (1<<I2EN);//使能iic
}
//等待指定的状态
//失败返回1 成功返回0
static u8 WaitResponse(u8 response)
{
u8 retry = 200;
while(--retry)
{
DelayUs(1);
if(STATE == response)break;
}
if(retry)return 0;
else
{
iic0_send_stop();
return 1;
}
}
u8 iic0_start(void)//发送起始信号
{
LPC_I2C0->CONCLR = (1<<SIC)|(1<<STAC)|(1<<AAC);
//Start
LPC_I2C0->CONSET = (1<<STA);//发送start,等待iic 状态寄存器达到指定状态
return WaitResponse(STATUS_SENDSTART);//等待起始条件发送成功
}
u8 iic0_send_write_addr(u8 addr) //发送设备写地址
{
//dev_addr
LPC_I2C0->DAT = addr;
LPC_I2C0->CONSET = (1<<AA);//自动ack 好像这一位无关紧要现在
LPC_I2C0->CONCLR = (1<<SIC)|(1<<STAC);//停止中断与start
return WaitResponse(STATUS_SENDSLAVE_ACK);//等待设备ack
}
u8 iic0_send_data(u8 data) //发送数据
{
LPC_I2C0->DAT = data;
LPC_I2C0->CONSET = (1<<AA);//自动ack
LPC_I2C0->CONCLR = (1<<SIC)|(1<<STAC);;//清除中断和start
return WaitResponse(STATUS_SENDDATA_ACK);
}
u8 iic0_send_stop(void) //发送停止
{
LPC_I2C0->CONCLR = (1<<SIC)|(1<<STAC)|(1<<AAC);
LPC_I2C0->CONSET = (1<<STO);
LPC_I2C0->CONCLR = (1<<SIC);
return 0;
}
u8 iic0_send_read_addr(u8 addr) //发送读地址
{
LPC_I2C0->DAT = addr;
LPC_I2C0->CONSET = (1<<AA);
LPC_I2C0->CONCLR = (1<<SIC)|(1<<STAC);
return WaitResponse(STATUS_READADDR_ACK);
}
u8 iic0_read_data(u8* value,u8 ack) //读取数据 1发送ack 0不发送
{
if(ack)
{
LPC_I2C0->CONSET = (1<<AA);
LPC_I2C0->CONCLR = (1<<SIC);
if( WaitResponse(STATUS_RECV_ACK))return 1;
}
else
{
LPC_I2C0->CONCLR = (1<<AAC)|(1<<SIC);
if(WaitResponse(STATUS_RECV_NACK))return 1;
}
*value = LPC_I2C0->DAT;
return 0;
}
u8 iic0_repeat_start(void) //重新发送start
{
LPC_I2C0->CONCLR = (1<<SIC);//清除中断再次发送start
LPC_I2C0->CONSET = (1<<STA);
return WaitResponse(STATUS_REPEATSTART);//等待重复start成功
}
LPC1788的IIC使用的更多相关文章
- IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)
首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...
- 基于STM32Cube的IIC主从通信
1.建立STM32Cube工程,我使用的芯片是STM32F429,为了更简单的建立单独的IIC通信任务,我使用了FREERTOS,另外选择了RCC(系统时钟初始化),I2C1,I2C2(为了验证代码的 ...
- STM32 IIC
#include "Type.h" #include "IIC.h" #include "Delay.h" void I2C_Init(vo ...
- 基于华清远见STM32f051的 IIC从模式实现方法
作者:卢老师,华清远见嵌入式学院讲师. 在大多情况下,我们使用MCU控制传感器,节点以及相关从设备,但在较为复杂的系统中,有时候也会使用MCU做为从设备. 下面是关于stm32f051的从模式实现方法 ...
- IIC总线
一. 概述 1. IIC总线是PHILIPS公司推出的一种串口总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串口总线. 2. IIC总线只有两根双向信号线.一根是数据线SDA,一 ...
- stm8的IIC库的使用
一.前言 stm8是一款低功耗的MCU芯片,它具备stm32库函数和资源丰富的优势.也同时具有价格便宜,低功耗的特点.在一些项目中,能起到很好的作用.下面我介绍一下stm8的IIC硬件库函数驱动代码及 ...
- IIC总线解析
IIC简介: IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ICS) ,IIC是一种多向控 ...
- IIC
IIC多主从,双向传输,只有两根线:一根数据,一根时钟,时钟必须由主机发出控制.初始化时主机把SCL和SDA的电平都拉高,然后在SCL保持高电平时SDA拉低形成一个开始信号,紧接着开始信号就开始发送要 ...
- px4flow通过iic读取具体寄存器数据程序
底层通信用了昨天写好的iic,今天结合官方资料成功读出所有指定寄存器的数据附上源码 include.h主要包括了一些stm32 IO控制的宏定义,具体参考正点原子所有例程中都有的sys.h头文件 in ...
随机推荐
- ngnix配置文件
使用nginx最大的好处就是负载均衡. #设定负载均衡的服务器列表 upstream service{ server 10.4.29.174:7477; } server { ...
- CodeIgniter 如何去掉 Index.php
步骤; 1.打开你的WEB服务器的httpd.conf文件. 2.找到LoadModule rewrite_module modules/mod_rewrite.so这行,把该行前的#去掉.保存该文件 ...
- WebSocket学习笔记——无痛入门
WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报 分类: 物联网学习笔记(37) 版权声明:本文为博主原 ...
- 初识Selenium(三)
浅谈基于Selenium的Web自动化测试框架 发表于:2011-4-25 10:58 作者:邵育亮 来源:51Testing软件测试网原创 字体:大 中 小 | 上一篇 | 下一篇 | 打印 ...
- PAT (Advanced Level) 1101. Quick Sort (25)
树状数组+离散化 #include<cstdio> #include<cstring> #include<cmath> #include<map> #i ...
- 最短路径算法专题2----Dijkstra
这个算法适用于求单源最短路径,从一点出发,到其余个点的最短路径. 算法要点: 1.用二维数组存放点到点的距离-----不能相互到达的点用MAX代替距离 2.用dis数组存放源点到任意其他一点的距离-- ...
- 尝试在数据库 5 中提取逻辑页 (1:1640) 失败。该逻辑页属于分配单元XXX ,而非 XXX。
此信息表明数据库或表 已经部分损坏可以通过以下步骤尝试修复: 1. DBCC CHECKDB 重启服务器后,在没有进行任何操作的情况下,在SQL查询分析器中执行以下SQL进行数据库的修复,修复数据库存 ...
- JAVA的三大特征 封装继承多态- 简单总结
简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...
- android复习-AnsyTask
AnsyTask是一种类似Thread+Hander机制的处理耗时操作的类, 通过在UI线程中excute()启动操作, 在AnsyTask中 doInBackground()中处理耗时操作(运行在自 ...
- C# 开发技巧]如何防止程序多次运行 线程 进程
程序员必有一些好习惯,我的就是看到好文章就收下 文章来源 http://www.cnblogs.com/zhili/p/OnlyInstance.html 转载请注明出处 最近发现很多人在论坛中问 ...