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 ...
 
随机推荐
- easyui-combobox select  设置不分行(只显示在一行)
			
使用easyui 1.4.4 <select id="hotalid" class="easyui-combobox" data-options=&quo ...
 - c# 去除文本的html标签
			
public static string ContentReplace(string input) { input = Regex.Replace(input, @"<(.[^> ...
 - ubuntu虚拟机和主机互ping及secureCRT使用
			
1.首先使用ifconfig查看IP,如果没有IP的话就配置IP,配置的IP要和主机在一个网段,可以使用ipconfig查看主机(WIN7)的ip地址. 2.根据ifconfig列出的网卡配置IP地址 ...
 - 2017 ZSTU寒假排位赛 #1
			
题目链接:https://vjudge.net/contest/147102#overview. A题:给出一堆的点,要找出两条垂直的直线,一条与x轴呈45度.-->使得所有的点到任意一条直线的 ...
 - AJAX(XMLHttpRequest)进行跨域请求方法详解(二)
			
注意:以下代码请在Firefox 3.5.Chrome 3.0.Safari 4之后的版本中进行测试.IE8的实现方法与其他浏览不同. 2,预检请求 预检请求首先需要向另外一个域名的资源发送一个 HT ...
 - 深入理解React、Redux
			
深入理解React.ReduReact+Redux非常精炼,良好运用将发挥出极强劲的生产力.但最大的挑战来自于函数式编程(FP)范式.在工程化过程中,架构(顶层)设计将是一个巨大的挑战.要不然做出来的 ...
 - 转 图片缓存之内存缓存技术LruCache,软引用
			
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
 - zf-中间库(xzfw_xzjc_jianshi)
			
比如说 xzfw_xzjc_jianshi 就是 建始的 一个中间库 这个(zwfw)是有个触发器,将数据交换到中间库xzfw_xzjc_jianshi 这个中间库 老版本没有交换工具,将数据交换到监 ...
 - [转]makefile文件的编写规则及实例
			
http://xueqi.iteye.com/blog/1567866 1.一个简单的makefile例子 假设一个程序有两个文件file1.c,file2.c,每个文件都包含head.h,生 ...
 - CSS中关于margin的理解误区
			
思考一 在以前,我对于margin的理解是这样的,此处用margin-top举例:指的是离相邻元素之间的距离. 但是实际是:相对于自身原来的位置偏移. 举个例子: <!DOCTYPE HTML ...