#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使用的更多相关文章

  1. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

  2. 基于STM32Cube的IIC主从通信

    1.建立STM32Cube工程,我使用的芯片是STM32F429,为了更简单的建立单独的IIC通信任务,我使用了FREERTOS,另外选择了RCC(系统时钟初始化),I2C1,I2C2(为了验证代码的 ...

  3. STM32 IIC

    #include "Type.h" #include "IIC.h" #include "Delay.h" void I2C_Init(vo ...

  4. 基于华清远见STM32f051的 IIC从模式实现方法

    作者:卢老师,华清远见嵌入式学院讲师. 在大多情况下,我们使用MCU控制传感器,节点以及相关从设备,但在较为复杂的系统中,有时候也会使用MCU做为从设备. 下面是关于stm32f051的从模式实现方法 ...

  5. IIC总线

    一. 概述 1. IIC总线是PHILIPS公司推出的一种串口总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串口总线. 2. IIC总线只有两根双向信号线.一根是数据线SDA,一 ...

  6. stm8的IIC库的使用

    一.前言 stm8是一款低功耗的MCU芯片,它具备stm32库函数和资源丰富的优势.也同时具有价格便宜,低功耗的特点.在一些项目中,能起到很好的作用.下面我介绍一下stm8的IIC硬件库函数驱动代码及 ...

  7. IIC总线解析

    IIC简介: IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ICS) ,IIC是一种多向控 ...

  8. IIC

    IIC多主从,双向传输,只有两根线:一根数据,一根时钟,时钟必须由主机发出控制.初始化时主机把SCL和SDA的电平都拉高,然后在SCL保持高电平时SDA拉低形成一个开始信号,紧接着开始信号就开始发送要 ...

  9. px4flow通过iic读取具体寄存器数据程序

    底层通信用了昨天写好的iic,今天结合官方资料成功读出所有指定寄存器的数据附上源码 include.h主要包括了一些stm32 IO控制的宏定义,具体参考正点原子所有例程中都有的sys.h头文件 in ...

随机推荐

  1. 异步加载AsyncTask

    private void huodeshuju() {        new AsyncTask<String, Void, String>() {            @Overrid ...

  2. pat L2-006. 树的遍历

    L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...

  3. UVA 796 Critical Links (tarjan算法求割边)

    这是在kuangbin的题目里看到的,不得不吐槽一下,题目中居然没给出数据范围,还是我自己猜的-本来是一道挺裸的题,但是我wa了好多次,原因就是这里面有两个坑点,1重边特判,2输出时左边必须比右边小. ...

  4. My workbench draft

    System Linux / Ubuntu 14.04.5 LTS (Trusty Tahr) + ROS Indigo Linux / Ubuntu 16.04.1 LTS (Xenial Xeru ...

  5. Linux系统编程读书笔记

    文件I/O模型 Linux的哲学思想,一切皆文件,这也是Linux文件操作的方便之处.系统调用不会分配缓冲区用以返回信息给调用者.所以必须提前分配大小合适的缓冲区并将缓冲区指针传递给系统调用. 1.o ...

  6. (一)、Struts第一天

    (一).Struts第一天 1. JavaWeb知识回顾 n 客户端编程 HTLM/CSS/JS n XML技术 会写XML * 基本语法 * DTD * Schema 会读XML * Dom4J读取 ...

  7. STM32软件复位(基于库文件V3.5)

    源:STM32软件复位(基于库文件V3.5) void SoftReset(void) { __set_FAULTMASK(); // 关闭所有中端 NVIC_SystemReset();// 复位 ...

  8. JS 从一个字符串中截取两个字符串之间的字符串

    /************************************************* 函数说明:从一个字符串中截取 两个字符串之间的字符串 参数说明:src_str 原串, start ...

  9. gen_create_syn.sql

    set echo off feedback off verify off pagesize 0 linesize 120 ---变量从 sqlplus 的 call代码 传递过来 . -- 1 表示连 ...

  10. FusionCharts使用问题及解决方法(二)-FusionCharts常见问题大全

    在上文中,我们介绍了FusionCharts常见问题(FAQ)的解决方法,本文将一同讨论FusionCharts使用者面临的一些复杂问题的解决方法. 如何启用JavaScript调试模式? 要启用Ja ...