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成功

}

时间: 2025-01-09 04:21:26

LPC1788的IIC使用的相关文章

IIC总线协议

 II2C C总线的简单的概述 1.( 总线(Inter Integrated Circuit Bus Inter Integrated Circuit Bus):是 ):是Philips Philips公司 公司 推出的串行总线标准(为二线制).总线上扩展的外围器件及外设接 推出的串行总线标准(为二线制). 2.总线上扩展的外围器件及外设接 口通过总线寻址,是具备总线仲裁和高低速设备同步等功能的高性能 口通过总线寻址,是具备总线仲裁和高低速设备同步等功能的高性能 多主机总线. 3.特点:组成系

Chipscope 仿真VmodCAM IIC程序

Chipscope 仿真VmodCAM IIC程序: 目的:熟悉EDK中建立chipscope 注意:zedboard使用digilent USB下载时,chipscope不能和SDK同一时候使用.否则芯片会死机. 要用仿真器烧敲代码. 1:搭建硬件平台 硬件平台例如以下所看到的:详细的EDK设计流程參见XILINX大学workshop http://china.xilinx.com/support/university/professors.html 搭建后的平台见下图,当中除了IIC和axi

hello iic

刚刚终于弄出来了这个.发现自己很多问题. 一 mian函数 #include "led.h"#include "delay.h"#include "sys.h"#include "lcd.h"#include "usart.h"#include "usmart.h" #include "24cxx.h" const u8 TEXT_Buffer[]={0xee,0x3

【记录】IIC

概要 IIC(IIC,inter-Integrated circuit),两线式串行总线,用于MCU和外设间的通信. IIC只需两根线:数据线SDA和时钟线SCL.以半双工方式实现MCU和外设之间数据传输,速度可达400kbps. 多主机I2C总线结构 注意SDA和SCL两根总线需要上拉,使总线处于空闲状态. IIC协议 空闲状态 协议规定,SDA和SCL同时为高电平时,总线处于空闲状态.上拉电阻保证电平处于高电平. 起始信号和停止信号 起始信号:SCL为高电平时,SDA电平发生高到低的跳变 停

(转)IIC总线工作原理(1)

转载:http://www.eefocus.com/article/08-07/48416s.html图11-1给出一个由MCU作为主机,通过IIC总线带3个从机的单主机IIC总线系统.这是最常用.最典型的IIC总线连接方式. 物理结构上,IIC系统由一条串行数据线SDA和一条串行时钟线SCL组成.主机按一定的通信协议向从机寻址和进行信息 传输.在数据传输时,由主机初始化一次数据传输,主机使数据在SDA线上传输的同时还通过SCL线传输时钟.信息传输的对象和方向以及信息传输的开始和终 止均由主机决

IIC总线学习基础以及24C02芯片学习(一)

一.IIC总线基础知识 1.IIC总线的特性:A.只有两条总线线路,一条串行数据线SDA,一条串行时钟线SCL.B.每一个连接到总线的器件都可以通过唯一的地址和一直存在的主机/从机关联,并由软件设定地址,也可以由硬件设定地址.主机可以作为主机发送器和主机接收器. 2.关于IIC的几个知识点: 二.24C02EEPROM芯片 1.EEPPROM是电可擦除存储芯片.掉电数据不丢失.管脚和定义如图: 2.24C02的写字节时序:

6轴速度计/陀螺仪MPU6050模块 IIC程序C代码

资料下载 http://pan.baidu.com/s/15QGGG 产品参数 名称:MPU-6050模块(三轴陀螺仪+三轴加速度) 使用芯片:MPU-6050 供电电源:3-5V(内部低压差稳压) 通信方式:标准IIC通信协议 芯片内置16bit AD转换器,16位数据输出 陀螺仪范围::±250 500 1000 2000  °/s 加速度范围:±2±4±8±16g 采用沉金PCB,机器焊接工艺保证质量 引脚间距2.54mm MPU-6000为全球首例整合性6轴运动处理组件,相较于多组件方案

IIC协议

参考文章:简单的I2C协议理解.http://blog.csdn.net/zmq5411/article/details/6085740 ? 文中以EEPROM为例,且以master角度阐述. 一. 技术性能: 工作速率有100K和400K两种: 支持多机通讯: 支持多主控模块,但同一时刻只允许有一个主控: 由数据线SDA和时钟SCL构成的串行总线: 每个电路和模块都有唯一的地址: 每个器件可以使用独立电源 ? 二. 基本工作原理: 以启动信号START来掌管总线,以停止信号STOP来释放总线:

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十六:IIC储存模块

IIC储存器是笔者用来练习精密控时的经典例子.<整合篇>之际,IIC储存器的解释,笔者也自认变态.如今笔者回头望去,笔者也不知道自己当初到底发什么神经,既然将IIC的时序都解释一番.由于开发上板也嵌着IIC储存器(24LC04),笔者还得循例地介绍一下. IIC储存器是应用IIC总线的储存器,时序本身并不是很复杂不过缺有一大堆时序参数,而且官方提供的时序也不利于描述,所以许多时序都必须自行绘制,真是麻烦死人.麻烦归麻烦,笔者终究还要吃饭,为了肚子,再麻烦的事情也要硬着头皮捱过去 ... 这也是