当前位置:首页 > 单片机 > 单片机
[导读]IIC是Philips推出的芯片间串行传输总线,它以二根连线实现完善的全双工同步数据传送,可以极方便地构成多机系统和外围器件扩展系统。由于其接口简单灵活,很多外围器件均提供了IIC接口,如手机、平板常用的重力传感器

IIC是Philips推出的芯片间串行传输总线,它以二根连线实现完善的全双工同步数据传送,可以极方便地构成多机系统和外围器件扩展系统。由于其接口简单灵活,很多外围器件均提供了IIC接口,如手机、平板常用的重力传感器、地磁感应、陀螺仪、电容屏接口等均是采用IIC接口的。这些器件采用IIC接口可减少芯片封装的引脚,使之更小型化,同时也可以降低布线难度,这对于手机、平板这些PCB芯片集成度相当高的产品来说是很有必要的。笔者此处就s3c2416的IIC接口应用作一个简单的介绍。

1. IIC总线概述

IIC总线物理上包括两条总线线路,一条串行数据线SDA,一条串行时钟线SCL。为了使各个IIC设备线与相连在总线上,IIC总线接口均采用开集电极或开漏输出。因此,在IIC总线中是必须接上拉电阻的,上拉电阻的大小通常为1k~10k。上拉电阻小了,则IIC总线功耗增加,上拉电阻大了,负载能力弱,并且影响总线的允许传输速率。

IIC总线可构成多主和主从系统,在多主系统结构中,系统通过硬件或软件仲裁获得总线控制使用权。应用系统中IIC总线多采用主从结构,即总线上只有一个主控节点,总线上的其他设备都作为从设备。由于IIC通信使用7比特地址空间和16个保留地址,因此理论上同一总线能够支持的最大通信结点数为112个。但实际应用时,应尽可能地减小总线上的通信结点数,以增强总线的稳定性。因为通信结点的引入,同时也会引入寄生电容,而IIC总线结点数量受到总线最大电容400pF的限制。总线的传输速率为100Kbit/s(标准模式),400Kbit/s(快速模式),1Mbit/s(快速附加模式),3.4Mbit/s(高速模式)。

其它的总线时序等请参考相关的IIC总线标准,笔者在此不再详述。

2. IIC驱动实现

s3c2416具有一路多主IIC串行接口,可作为主机,也可作为从机。对于IIC的操作,s3c2416的spec给出了非常详细的编程步骤,见下图:

图2-1 主机发送操作



图2-2 主机接收操作


图2-3 从机发送操作



图2-4 从机接收操作

此处主要介绍s3c2416 IIC外设作为主机的编程实现。IIC外设首先应进行初始化,包括引脚配置成IIC功能引脚,设置IIC的时钟等。对于外设通信,推荐用中断的方式进行收发数据,因为外设通信相对于cpu执行速度都是极其慢的,用查询的方法会让cpu进入空等状态,在大量数据要通过外设收发时,将造成cpu效率及其低下。一方面其它任务需要cpu执行,另一方面cpu在空等外设收发数据的完成。因此笔者采用的是中断方式进行IIC通信,需要在初始化函数中注册相应的IIC中断处理函数,并开启中断。异常处理在启动代码中的Exception.c统一处理,把IIC中断处理函数注册进中断向量表中,并编写IIC中断处理即可。在有操作系统应用中,用中断的方式让cpu等待或接收信号量来完成IIC的通信,可以让cpu资源得到充分的利用。

IIC模块中应提供最基本的底层IIC读和IIC写这两个功能函数实现,以供上层调用。IIC_WriteBytes用来向某一从机(SlaveAdd)中相应内部地址(WriteAddr)进行写数据,待写数据在pData中,写入长度为Length。函数原型如下:

intIIC_WriteBytes(unsigned char SlaveAddr, unsignedchar WriteAddr, unsigned char *pData, int Length)

IIC_ReadBytes用来从某一从机(SlaveAdd)中相应内部地址(ReadAddr)进行读数据,读取的数据存放在pData中,读取长度为Length。函数原型如下:

intIIC_ReadBytes(unsigned char SlaveAddr, unsignedchar ReadAddr, unsigned char *pData, intLength)

IIC模块实现IIC.c内容如下:

#include"s3c2416.h"

#include"IIC.h"

#include"Exception.h"

#define IIC_ReadMode 1 // 连续读数据模式

#define IIC_WriteMode 2 // 连续写数据模式

#defineIIC_ReadSlaveMode 3 // 读从机地址模式

#defineIIC_WriteSlaveMode 4 // 写从机地址模式

// IIC状态,记录总线接口出错的信息

static volatile intIIC_Status;

// 跟踪IIC的状态转移,在中断中需确定IIC的状态,确定写或读

static volatile intIIC_Mode;

// 上层应用请求通过IIC接口发送或接收的数据长度计数

static volatile intIIC_DataCount;

// 数据发送或接收的存放位置

static volatile unsigned char *pIIC_Data;

static void Delay_us(unsigned int nCount)

{

//延时1us,共延时nCount(R0) us

__asm__ __volatile__ (

"Delay1:nt"

"LDR R1, =100nt" // Arm clock为400M

"Delay2:nt"

"SUBS R1, R1, #1nt" // 一个Arm clock

"BNE Delay2nt" // 跳转会清流水线,3个Arm clock

"SUBS R0, R0, #1nt" // 调用者确保nCount不为0

"BNE Delay1nt"

"BX LRnt"

);

}

static void IIC_IRQ()

{

unsigned char Status;

Status = rIICSTAT;

if (Status & (1<<3)) {

// bus arbitration is failed

IIC_Status "= ArbitrationFailed;

}

if (Status & (1<<2)) {

// a slave address is matched withIICADD

IIC_Status |= AddressMatche;

}

if (Status & (1<<1)) {

// a slave address is 0000000b

IIC_Status |= AddressZeros;

}

if (Status & (1<<0)) {

// ACK isn't received

IIC_Status |= NoAck;

}

switch (IIC_Mode) {

case IIC_ReadMode:

IIC_DataCount--;// 读了一字节,读计数减1

if (IIC_DataCount == 1) {

// 读最后一个数据,主机不应应答,不然从机再发送数据,应直接停止总线

*pIIC_Data = rIICDS;

pIIC_Data++;

rIICCON &= ~(1 <<7); // 读最后一字节禁止主机应答

rIICCON &= ~(1<< 4); // 恢复操作,读下一个数据

} else if(IIC_DataCount == 0) {

*pIIC_Data =rIICDS; // 所有数据接收完

// 若有操作系统,应用在数据等待发送完时通过信号量

// 或标志等待而挂起OSSemPend(ucos),这样不会让cpu查询

// 等待,极大提高效率。发送信号量或标志,唤醒等待的

// 应用OSSemPost(ucos)

} else { // 数据未接收完

*pIIC_Data = rIICDS;

pIIC_Data++;

rIICCON &= ~(1<< 4);// 恢复操作,连续读下一个数据

}

break;

case IIC_WriteMode:

IIC_DataCount--;// 写了一字节,写计数减1

if (IIC_DataCount != 0){

pIIC_Data++; // 数据未写完,写下一数据

rIICDS =*pIIC_Data;

rIICCON &= ~(1<< 4); // 恢复操作,连续下一个数据

} els

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

现在主要讲解一下在GCC移植UCGUI,Makefile工程如何加入目录,加入源码,c标准库,编译选项的设置。笔者的Makefile模板提取自uboot,工程中加入目录,加入源码都是很简单的,详细的介绍请参考前面章节”...

关键字: gcc s3c2416 ucgui 移植 裸机开发

jpeg格式是一种针对相片影像而广泛使用的一种失真压缩标准,其压缩技术十分先进,用有损压缩方式去除冗余的图像数据,在获得极高压缩率的同时,能展现十分丰富生动的图像,能用最少的磁盘空间得到较好的图像品质。由

关键字: s3c2416 移植 裸机开发 libjpeg

在消费电子产品中,往往都会用到音频系统来播放音乐、进行通话等多媒体应用,此外,对于一些需语音提示的产品,音频部分都是不可或缺的功能。笔者此处就s3c2416的音频驱动实现作一个简单的介绍。1. IIS音频总线s3c24

关键字: s3c2416 裸机开发 音频驱动

S3C2416裸机开发系列十八_音频驱动实现(2)标签:WM8960IIS音频驱动s3c2416裸机开发2014-06-10 09:50853人阅读评论(0)收藏举报分类:s3c2416裸机开发(24)版权声明:本文为博...

关键字: s3c2416 裸机开发 音频驱动

很多的嵌入式系统都需要人机交互,对于输出设备,LCD以其显示质量高、画面效果好等优点得到了极其广泛的应用。s3c2416包含了一个LCD控制器,笔者此处就s3c2416的LCD应用作一个简单的介绍。1、LCD控制器概述1...

关键字: s3c2416 裸机开发 rgb屏 驱动显示

在嵌入式设计中,由于Nand Flash具有大容量,擦写次数高,接口简单等优点,常用作固化存储器。S3C2416支持Nand启动,因此Nand存储器可以直接保存固化代码以及其它的数据。笔者在此简单的介绍Nand flas...

关键字: nand驱动 s3c2416 裸机开发 nand启动

笔者前面章节简单介绍了s3c2416启动代码的实现过程,启动代码就是用来处理cpu体系结构中一些底层内容,一个功能强大的启动代码是可以当作bootloader(如uboot)来用的。有了启动代码,用户就可以专注于用c来作...

关键字: mdk s3c2416 启动代码 裸机开发

启动代码是处理器上电复位后最先运行的一段代码。主要是用来把处理器初始化到一个确定的状态,为c运行环境作好准备。如设置异常向量表,初始化系统时钟,初始化外部内存,把用户代码拷贝到外部内存,初始化栈,清0全

关键字: s3c2416 启动代码 流水灯 裸机开发

S3C2416裸机开发系列十九_Fatfs下播放录音wav音频文件标签:wavfatfs音频播放s3c2416sd驱动2014-06-11 09:551938人阅读评论(0)收藏举报分类:s3c2416裸机开发(24)版...

关键字: s3c2416 裸机开发 播放录音 音频文件

对于处理器来说,都不可能内置过大的内存,只保留一小块SRAM作为芯片启动用。例如S3C2416内部SRAM只有64k,其中8k是作为SteppingStone,用来做一些基本的初始化,并进一步引导用户的代码启动。用户的代...

关键字: s3c2416 初始化 裸机开发 外部内存 代码搬移
关闭
关闭