LPC2478的硬件IIC使用
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使用的更多相关文章
- STM32硬件IIC操作
Stm32具有IIC接口,接口有以下主要特性 多主机功能:该模块既可做主设备也可做从设备 主设备功能 C地址检测 位/10位地址和广播呼叫 支持不同的通讯速度 状态标志: 发送器/接收器模式标志 字节 ...
- STM32硬件IIC (转)
源: STM32硬件IIC
- STM32硬件IIC驱动设计(转)
源: STM32硬件IIC驱动设计 参考: STM32—硬件IIC主机通信 STM32’s I2C 硬件BUG引发的血案(qzm) 解决STM32 I2C接口死锁在BUSY状态的方法讨论
- STM32硬件IIC
/** * @brief 写一个字节到I2C设备中 * @param * @arg pBuffer:缓冲区指针 * @arg WriteAddr:写地址 * @retval 正常返回1,异常返回0 * ...
- STM32 IIC双机通信—— HAL库硬件IIC版
参考传送门 关于IIC的原理这里我就不多说了,网上有很多很好的解析,如果要看我个人对IIC的理解的话,可以点击查看,这里主要讲一下怎样利用STM32CubeMx实现IIC的通讯,经过个人实践,感觉HA ...
- STM32读取bq33100数据——硬件IIC
背景:拟采用bq33100超级电容管理芯片,实现自动的超级电容组的均压任务.需监控芯片的工作情况,以及电容组的均压情况. 平台: 硬件:STM32F103C8T6 通信:SMBus(低速IIC) 目标 ...
- 硬件IIC驱动原理
1.IIC物理层 IIC通信属于同步半双工通信,IIC总线由两根信号线组成.一根是数据线SDA,一根是时钟线SCL,时钟线只能由主机发送给从机,数据线可以双向进行通信,总线上可挂载多个设备,挂载数量受 ...
- S3C2440硬件IIC详解
S3C2440A RISC微处理器可以支持一个多主控IIC 总线串行接口.一条专用串行数据线(SDA)和一条专用串行时钟线(SCL)传递连接到IIC总线的总线主控和外设之间的信息.SDA和SCL线都为 ...
- (转)stm32硬件IIC
cube与I2C:https://www.cnblogs.com/121792730applllo/p/5044920.html I2C官网:https://www.i2c-bus.org/stand ...
随机推荐
- 内核添加对yaffs2文件系统的支持
移植方法: 第一步,我们需要YAFFS2的源码,如果大家有兴趣想了解YAFFS2文件系统的驱动原理的话可以直接去访问他们的官网,地址是www.yaffs2.net,上面说的很详细的,也有源码下载地址, ...
- Jmeter的优点是什么?除了轻量级,它和LoadRunner有什么本质区别
1.jmeter的架构和loadrunner原理一样,都是通过中间代理,监控和收集并发客户端发出的指令,把他们生成脚本,再发送到应用服务器,再监控服务器反馈结果的一个过程: 2.分布式中间代理功能在j ...
- iframe2016/4/12
js操作iframe contentWindow 在服务器环境下测试contentDocument二种方法的区别子级iframe修改父级元素内容window.parentwindow.top与w ...
- Linux学习 -- 日志管理
日志服务 rsyslogd CentOS6 取代了原来的syslog rsyslogd 默认启动.自启动 常用命令:lastb.lastlog.last.w.who.users. 系统默认日志 和 ...
- 转:浅谈手机app测试注意点
现在我们测试时,开发会先在本地机上打好测试包,自己安装,轮完一轮,开发修改好后,再打一个包.以下是功能测试时需要注意的点: 1.登录 ●登录用户名和密码错误时,界面有提示信息 ●用户主动退出登录后,下 ...
- C1 FlexGrid控件 Editor 冲突问题
当给C1FlexGrid控件加入 Checkbox后,添加新行时对新行的Editor 赋新控件时,会冲突如下图: 下面我们借助BeforeRowColChange 事件来解决这个问题: 我 ...
- 归心似箭,IT达人分享抢票攻略
[51CTO专稿]随着春节一天天临近,“购票难”的问题也愈发凸显,猎豹.火狐.360等“春运抢票神器”占领了各大网站的重要版面,“技术抢票”成为炙手可热的话题,看看身为程序员的邓以克是如何抢到回家的票 ...
- cc2530 寄存器PICTL理解
- git版本控制(一)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 基本的dom操作方法
childNodes 返回当前元素所有子元素的数组firstChild 返回当前元素的第一个下级子元素lastChild 返回当前元素的最后一个子元素nextSibling 返回紧跟在当前元素后面的元 ...