LPC2478的IIC使用

LPC2478带有三个IIC接口,每个IIC都可以工作在主机或者从机模式下,LPC的IIC的架构是一种状态机的形式,在不同的的时间做不同的工作之后有不同的状态来表示,

简单来说,就是发送起始字节之后会有一个状态,接收到ACK之后会有一个状态,软件上根据已知的外设状态来进行下一步操作

具体的状态请查看数据手册,IIC的可用寄存器如下

对应不同的驱动方式,例如I2EN为1+STA为1,代表发送起始位+从机地址

将置位寄存器的数据清零,BIT一一对应

状态机的核心

数据发送缓存

从机地址,最高位读写位硬件自动加上

还有两个寄存器是SCL低电平占空比和高电平占空比,均为50%即可

具体代码如下所示

#ifndef __IIC0_H_
#define __IIC0_H_
#include "common.h"
#include "lpc24xx.h"
#include "clock.h" #define STATUS_SENDSTART 0X08
#define STATUS_REPEATSTART 0X10
#define STATUS_SENDSLAVE_ACK 0X18
#define STATUS_SENDSLAVE_NACK 0X20
#define STATUS_SENDDATA_ACK 0X28
#define STATUS_SENDDATA_NACK 0X30
#define STATUS_LOSS 0X38
#define STATUS_READADDR_NACK 0X48
#define STATUS_READADDR_ACK 0X40
#define STATUS_RECV_ACK 0X50
#define STATUS_RECV_NACK 0X58 void IIC0Init(u32 baud); u8 IIC0Start(void); u8 IIC0SendWriteAddr(u8 addr); u8 IIC0SendData(u8 data); u8 IIC0SendStop(void); u8 IIC0SendReadAddr(u8 addr); u8 IIC0ReadData(u8* value,u8 ack); u8 IIC0RepeatStart(void); #endif

#include "iic.h"

#define I20EN  6		//接口使能
#define STA 5 //起始标志
#define STO 4 //停止标志
#define SI 3 //中断标志
#define AA 2 //应答标志 #define I20ENC 6 //
#define STAC 5
#define SIC 3
#define AAC 2 #define STATE (I20STAT & 0xf8) void IIC0Init(u32 baud)
{
u32 t = (SystemCoreClock/4)/baud;
//打开IIC时钟
PCONP |= (1 << 7);
//配置IIC引脚 sda
PINSEL1 &= ~(0x03<<22);
PINSEL1 |= (0x01<<22);
PINMODE1 &= ~(0x03<<22);
PINMODE1 |= (0x01<<22); //scl
PINSEL1 &= ~(0x03<<24);
PINSEL1 |= (0x01<<24);
PINMODE1 &= ~(0x03<<24);
PINMODE1 |= (0x01<<24); I20SCLL = t/2;
I20SCLH = t/2; I20CONSET = (1<<I20EN);//接口使能
}
//等待指定的状态
//失败返回1 成功返回0
u8 WaitResponse(u8 response)
{
u8 retry = 200;
while(--retry)
{
if(STATE == response)break;
}
if(retry)return 0;
else return 1;
} u8 IIC0Start(void)
{
I20CONCLR = (1<<SIC)|(1<<STAC)|(1<<AAC);
//Start
I20CONSET = (1<<STA);
return WaitResponse(STATUS_SENDSTART);
} u8 IIC0RepeatStart(void)
{
//repeat start
I20CONCLR = (1<<SIC);
I20CONSET = (1<<STA);
return WaitResponse(STATUS_REPEATSTART);
} u8 IIC0SendWriteAddr(u8 addr)
{
//dev_addr
I20DAT = addr;
I20CONSET = (1<<AA);
I20CONCLR = (1<<SIC)|(1<<STAC);
return WaitResponse(STATUS_SENDSLAVE_ACK);
} u8 IIC0SendData(u8 data)
{
I20DAT = data;
I20CONSET = (1<<AA);
I20CONCLR = (1<<SIC);
return WaitResponse(STATUS_SENDDATA_ACK);
} u8 IIC0SendStop(void)
{
I20CONCLR = (1<<SIC)|(1<<STAC)|(1<<AAC);
I20CONSET = (1<<STO);
I20CONCLR = (1<<SIC);
return 0;
} u8 IIC0SendReadAddr(u8 addr)
{
I20DAT = addr;
I20CONSET = (1<<AA);
I20CONCLR = (1<<SIC)|(1<<STAC);
return WaitResponse(STATUS_READADDR_ACK);
} u8 IIC0ReadData(u8* value,u8 ack)
{
if(ack)
{
I20CONSET = (1<<AA);
I20CONCLR = (1<<SIC);
if( WaitResponse(STATUS_RECV_ACK))return 1;
}
else
{
I20CONCLR = (1<<AAC)|(1<<SIC);
if(WaitResponse(STATUS_RECV_NACK))return 1;
}
*value = I20DAT;
return 0;
}

LPC2478的硬件IIC使用的更多相关文章

  1. STM32硬件IIC操作

    Stm32具有IIC接口,接口有以下主要特性 多主机功能:该模块既可做主设备也可做从设备 主设备功能 C地址检测 位/10位地址和广播呼叫 支持不同的通讯速度 状态标志: 发送器/接收器模式标志 字节 ...

  2. STM32硬件IIC (转)

    源: STM32硬件IIC

  3. STM32硬件IIC驱动设计(转)

    源: STM32硬件IIC驱动设计 参考: STM32—硬件IIC主机通信 STM32’s I2C 硬件BUG引发的血案(qzm) 解决STM32 I2C接口死锁在BUSY状态的方法讨论

  4. STM32硬件IIC

    /** * @brief 写一个字节到I2C设备中 * @param * @arg pBuffer:缓冲区指针 * @arg WriteAddr:写地址 * @retval 正常返回1,异常返回0 * ...

  5. STM32 IIC双机通信—— HAL库硬件IIC版

    参考传送门 关于IIC的原理这里我就不多说了,网上有很多很好的解析,如果要看我个人对IIC的理解的话,可以点击查看,这里主要讲一下怎样利用STM32CubeMx实现IIC的通讯,经过个人实践,感觉HA ...

  6. STM32读取bq33100数据——硬件IIC

    背景:拟采用bq33100超级电容管理芯片,实现自动的超级电容组的均压任务.需监控芯片的工作情况,以及电容组的均压情况. 平台: 硬件:STM32F103C8T6 通信:SMBus(低速IIC) 目标 ...

  7. 硬件IIC驱动原理

    1.IIC物理层 IIC通信属于同步半双工通信,IIC总线由两根信号线组成.一根是数据线SDA,一根是时钟线SCL,时钟线只能由主机发送给从机,数据线可以双向进行通信,总线上可挂载多个设备,挂载数量受 ...

  8. S3C2440硬件IIC详解

    S3C2440A RISC微处理器可以支持一个多主控IIC 总线串行接口.一条专用串行数据线(SDA)和一条专用串行时钟线(SCL)传递连接到IIC总线的总线主控和外设之间的信息.SDA和SCL线都为 ...

  9. (转)stm32硬件IIC

    cube与I2C:https://www.cnblogs.com/121792730applllo/p/5044920.html I2C官网:https://www.i2c-bus.org/stand ...

随机推荐

  1. SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3&nbsp

    项目使用的是tomcat7 ,浏览器是ie11 突然打开浏览器发现不能获取数据了 tomcat conf server.xml 文件 <Connector port="8080&quo ...

  2. 转载 Deep learning:四(logistic regression练习)

    前言: 本节来练习下logistic regression相关内容,参考的资料为网页:http://openclassroom.stanford.edu/MainFolder/DocumentPage ...

  3. elasticsearch 手动控制分片分布

    elasticsearch可以通过reroute api来手动进行索引分片的分配.  不过要想完全手动,必须先把cluster.routing.allocation.disable_allocatio ...

  4. C#无边框窗体移动 将事件绑定到想实现的控件上

    [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("use ...

  5. 在线的代码托管平台 coding.net ===中国扩展版github

    coding.net 是国内新兴的一个项目管理平台,功能主要包括:代码托管.在线运行环境.监控代码质量,兼有一定的社交功能. 在线运行环境支持Java.Ruby.Node.js.PHP.Python. ...

  6. JSP文件上传--FileUpload组件

    如果使用上传操作,并且没有使用框架之类,最好使用Smartupload,因为FileUpdate太难使用. 下载组件: fileupload包:http://commons.apache.org/pr ...

  7. Linux通过防火墙禁止IP来防止攻击

    1. iptables -I INPUT -s 211.1.0.0 -j DROP 禁止211.1.0.0这个IP访问服务器 2. iptables -I INPUT -s 211.1.0.0 -j ...

  8. 用telnet命令,SMTP发送邮件

    邮件的发送是基于smtp协议的.邮件客户端软件给smtp服务器传送邮件和smtp服务器之间传送邮件也都是基于smtp协议的.邮件客户端软件接受邮件是主要基于pop3协议的. 下面介绍利用windows ...

  9. cap

    http://blog.javachen.com/2014/05/30/note-about-brewers-cap-theorem.html

  10. apache RewriteCond RewriteRule

    http://www.rockbb.com/blog/?p=319 http://www.cnblogs.com/scgw/archive/2011/12/10/2283029.html 我的理解:当 ...