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. php 日期处理 例子

    <?php date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d",time() ...

  2. Android之SurfaceView学习(一)转转

    Android之SurfaceView学习(一) 首先我们先来看下官方API对SurfaceView的介绍 SurfaceView的API介绍 Provides a dedicated drawing ...

  3. JavaScript(2)——对象属性、原型与原型链

    对象属性.原型与原型链 哈哈哈,我的第二篇博客哟,说的是对象属性.原型与原型链.可能这些只是某些小点串联起来的,逻辑性没有很强.所以会对文章的可读性和理解性带来一些困扰.不过,今天我又前进了那么一小步 ...

  4. javascript语句语义大全(7)

    1. 事件 onmousedown——鼠标按下事件 当鼠标按下的时候触发,根据鼠标不同的按键会有不同的值传入,左键0,滚轮1,右键2,不同浏览器可能有不同. onmousemove——当鼠标移动的时候 ...

  5. acm课程练习2--1005

    题目描述 Mr. West bought a new car! So he is travelling around the city.One day he comes to a vertical c ...

  6. Vim插件管理 -- Vundle

    1 插件目录  -/.vim/bundle/ 没有可自行创建 2 安装Vundle  $ git clone https://github.com/VundleVim/Vundle.vim.git   ...

  7. POJ 2289 Jamie's Contact Groups

    二分答案+网络最大流 #include<cstdio> #include<cstring> #include<cmath> #include<vector&g ...

  8. stock 仓位

    别胆大求多,不轻信盲从.抓住几只自己长期关注并看好的股票.将这几只股票选为自选股,而其他股,不管是机构推荐还是股评荐股,都要谨慎,不轻易听从. 巧用“三三制”,根据趋势控制仓位.当不知道是在涨还是在跌 ...

  9. 转 oracle 开发 第03章 sqlplus

    目录 1.查看表结构 desc 2.编辑SQL语句 append.list.change.run 3.保存.检索并运行文件 save.get.start.edit.spool 4.格式化列 colum ...

  10. 2016大连网络赛 Function

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Probl ...