日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]IIC是Philips推出的芯片間串行傳輸總線(xiàn),它以二根連線(xiàn)實(shí)現(xiàn)完善的全雙工同步數(shù)據(jù)傳送,可以極方便地構(gòu)成多機(jī)系統(tǒng)和外圍器件擴(kuò)展系統(tǒng)。由于其接口簡(jiǎn)單靈活,很多外圍器件均提供了IIC接口,如手機(jī)、平板常用的重力傳感器

IIC是Philips推出的芯片間串行傳輸總線(xiàn),它以二根連線(xiàn)實(shí)現(xiàn)完善的全雙工同步數(shù)據(jù)傳送,可以極方便地構(gòu)成多機(jī)系統(tǒng)和外圍器件擴(kuò)展系統(tǒng)。由于其接口簡(jiǎn)單靈活,很多外圍器件均提供了IIC接口,如手機(jī)、平板常用的重力傳感器、地磁感應(yīng)、陀螺儀、電容屏接口等均是采用IIC接口的。這些器件采用IIC接口可減少芯片封裝的引腳,使之更小型化,同時(shí)也可以降低布線(xiàn)難度,這對(duì)于手機(jī)、平板這些PCB芯片集成度相當(dāng)高的產(chǎn)品來(lái)說(shuō)是很有必要的。筆者此處就s3c2416的IIC接口應(yīng)用作一個(gè)簡(jiǎn)單的介紹。

1. IIC總線(xiàn)概述

IIC總線(xiàn)物理上包括兩條總線(xiàn)線(xiàn)路,一條串行數(shù)據(jù)線(xiàn)SDA,一條串行時(shí)鐘線(xiàn)SCL。為了使各個(gè)IIC設(shè)備線(xiàn)與相連在總線(xiàn)上,IIC總線(xiàn)接口均采用開(kāi)集電極或開(kāi)漏輸出。因此,在IIC總線(xiàn)中是必須接上拉電阻的,上拉電阻的大小通常為1k~10k。上拉電阻小了,則IIC總線(xiàn)功耗增加,上拉電阻大了,負(fù)載能力弱,并且影響總線(xiàn)的允許傳輸速率。

IIC總線(xiàn)可構(gòu)成多主和主從系統(tǒng),在多主系統(tǒng)結(jié)構(gòu)中,系統(tǒng)通過(guò)硬件或軟件仲裁獲得總線(xiàn)控制使用權(quán)。應(yīng)用系統(tǒng)中IIC總線(xiàn)多采用主從結(jié)構(gòu),即總線(xiàn)上只有一個(gè)主控節(jié)點(diǎn),總線(xiàn)上的其他設(shè)備都作為從設(shè)備。由于IIC通信使用7比特地址空間和16個(gè)保留地址,因此理論上同一總線(xiàn)能夠支持的最大通信結(jié)點(diǎn)數(shù)為112個(gè)。但實(shí)際應(yīng)用時(shí),應(yīng)盡可能地減小總線(xiàn)上的通信結(jié)點(diǎn)數(shù),以增強(qiáng)總線(xiàn)的穩(wěn)定性。因?yàn)橥ㄐ沤Y(jié)點(diǎn)的引入,同時(shí)也會(huì)引入寄生電容,而IIC總線(xiàn)結(jié)點(diǎn)數(shù)量受到總線(xiàn)最大電容400pF的限制。總線(xiàn)的傳輸速率為100Kbit/s(標(biāo)準(zhǔn)模式),400Kbit/s(快速模式),1Mbit/s(快速附加模式),3.4Mbit/s(高速模式)。

其它的總線(xiàn)時(shí)序等請(qǐng)參考相關(guān)的IIC總線(xiàn)標(biāo)準(zhǔn),筆者在此不再詳述。

2. IIC驅(qū)動(dòng)實(shí)現(xiàn)

s3c2416具有一路多主IIC串行接口,可作為主機(jī),也可作為從機(jī)。對(duì)于IIC的操作,s3c2416的spec給出了非常詳細(xì)的編程步驟,見(jiàn)下圖:

圖2-1 主機(jī)發(fā)送操作



圖2-2 主機(jī)接收操作


圖2-3 從機(jī)發(fā)送操作



圖2-4 從機(jī)接收操作

此處主要介紹s3c2416 IIC外設(shè)作為主機(jī)的編程實(shí)現(xiàn)。IIC外設(shè)首先應(yīng)進(jìn)行初始化,包括引腳配置成IIC功能引腳,設(shè)置IIC的時(shí)鐘等。對(duì)于外設(shè)通信,推薦用中斷的方式進(jìn)行收發(fā)數(shù)據(jù),因?yàn)橥庠O(shè)通信相對(duì)于cpu執(zhí)行速度都是極其慢的,用查詢(xún)的方法會(huì)讓cpu進(jìn)入空等狀態(tài),在大量數(shù)據(jù)要通過(guò)外設(shè)收發(fā)時(shí),將造成cpu效率及其低下。一方面其它任務(wù)需要cpu執(zhí)行,另一方面cpu在空等外設(shè)收發(fā)數(shù)據(jù)的完成。因此筆者采用的是中斷方式進(jìn)行IIC通信,需要在初始化函數(shù)中注冊(cè)相應(yīng)的IIC中斷處理函數(shù),并開(kāi)啟中斷。異常處理在啟動(dòng)代碼中的Exception.c統(tǒng)一處理,把IIC中斷處理函數(shù)注冊(cè)進(jìn)中斷向量表中,并編寫(xiě)IIC中斷處理即可。在有操作系統(tǒng)應(yīng)用中,用中斷的方式讓cpu等待或接收信號(hào)量來(lái)完成IIC的通信,可以讓cpu資源得到充分的利用。

IIC模塊中應(yīng)提供最基本的底層IIC讀和IIC寫(xiě)這兩個(gè)功能函數(shù)實(shí)現(xiàn),以供上層調(diào)用。IIC_WriteBytes用來(lái)向某一從機(jī)(SlaveAdd)中相應(yīng)內(nèi)部地址(WriteAddr)進(jìn)行寫(xiě)數(shù)據(jù),待寫(xiě)數(shù)據(jù)在pData中,寫(xiě)入長(zhǎng)度為L(zhǎng)ength。函數(shù)原型如下:

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

IIC_ReadBytes用來(lái)從某一從機(jī)(SlaveAdd)中相應(yīng)內(nèi)部地址(ReadAddr)進(jìn)行讀數(shù)據(jù),讀取的數(shù)據(jù)存放在pData中,讀取長(zhǎng)度為L(zhǎng)ength。函數(shù)原型如下:

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

IIC模塊實(shí)現(xiàn)IIC.c內(nèi)容如下:

#include"s3c2416.h"

#include"IIC.h"

#include"Exception.h"

#define IIC_ReadMode 1 // 連續(xù)讀數(shù)據(jù)模式

#define IIC_WriteMode 2 // 連續(xù)寫(xiě)數(shù)據(jù)模式

#defineIIC_ReadSlaveMode 3 // 讀從機(jī)地址模式

#defineIIC_WriteSlaveMode 4 // 寫(xiě)從機(jī)地址模式

// IIC狀態(tài),記錄總線(xiàn)接口出錯(cuò)的信息

static volatile intIIC_Status;

// 跟蹤IIC的狀態(tài)轉(zhuǎn)移,在中斷中需確定IIC的狀態(tài),確定寫(xiě)或讀

static volatile intIIC_Mode;

// 上層應(yīng)用請(qǐng)求通過(guò)IIC接口發(fā)送或接收的數(shù)據(jù)長(zhǎng)度計(jì)數(shù)

static volatile intIIC_DataCount;

// 數(shù)據(jù)發(fā)送或接收的存放位置

static volatile unsigned char *pIIC_Data;

static void Delay_us(unsigned int nCount)

{

//延時(shí)1us,共延時(shí)nCount(R0) us

__asm__ __volatile__ (

"Delay1:nt"

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

"Delay2:nt"

"SUBS R1, R1, #1nt" // 一個(gè)Arm clock

"BNE Delay2nt" // 跳轉(zhuǎn)會(huì)清流水線(xiàn),3個(gè)Arm clock

"SUBS R0, R0, #1nt" // 調(diào)用者確保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--;// 讀了一字節(jié),讀計(jì)數(shù)減1

if (IIC_DataCount == 1) {

// 讀最后一個(gè)數(shù)據(jù),主機(jī)不應(yīng)應(yīng)答,不然從機(jī)再發(fā)送數(shù)據(jù),應(yīng)直接停止總線(xiàn)

*pIIC_Data = rIICDS;

pIIC_Data++;

rIICCON &= ~(1 <<7); // 讀最后一字節(jié)禁止主機(jī)應(yīng)答

rIICCON &= ~(1<< 4); // 恢復(fù)操作,讀下一個(gè)數(shù)據(jù)

} else if(IIC_DataCount == 0) {

*pIIC_Data =rIICDS; // 所有數(shù)據(jù)接收完

// 若有操作系統(tǒng),應(yīng)用在數(shù)據(jù)等待發(fā)送完時(shí)通過(guò)信號(hào)量

// 或標(biāo)志等待而掛起OSSemPend(ucos),這樣不會(huì)讓cpu查詢(xún)

// 等待,極大提高效率。發(fā)送信號(hào)量或標(biāo)志,喚醒等待的

// 應(yīng)用OSSemPost(ucos)

} else { // 數(shù)據(jù)未接收完

*pIIC_Data = rIICDS;

pIIC_Data++;

rIICCON &= ~(1<< 4);// 恢復(fù)操作,連續(xù)讀下一個(gè)數(shù)據(jù)

}

break;

case IIC_WriteMode:

IIC_DataCount--;// 寫(xiě)了一字節(jié),寫(xiě)計(jì)數(shù)減1

if (IIC_DataCount != 0){

pIIC_Data++; // 數(shù)據(jù)未寫(xiě)完,寫(xiě)下一數(shù)據(jù)

rIICDS =*pIIC_Data;

rIICCON &= ~(1<< 4); // 恢復(fù)操作,連續(xù)下一個(gè)數(shù)據(jù)

} els

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

現(xiàn)在主要講解一下在GCC移植UCGUI,Makefile工程如何加入目錄,加入源碼,c標(biāo)準(zhǔn)庫(kù),編譯選項(xiàng)的設(shè)置。筆者的Makefile模板提取自u(píng)boot,工程中加入目錄,加入源碼都是很簡(jiǎn)單的,詳細(xì)的介紹請(qǐng)參考前面章節(jié)”...

關(guān)鍵字: gcc s3c2416 ucgui 移植 裸機(jī)開(kāi)發(fā)

jpeg格式是一種針對(duì)相片影像而廣泛使用的一種失真壓縮標(biāo)準(zhǔn),其壓縮技術(shù)十分先進(jìn),用有損壓縮方式去除冗余的圖像數(shù)據(jù),在獲得極高壓縮率的同時(shí),能展現(xiàn)十分豐富生動(dòng)的圖像,能用最少的磁盤(pán)空間得到較好的圖像品質(zhì)。由

關(guān)鍵字: s3c2416 移植 裸機(jī)開(kāi)發(fā) libjpeg

在消費(fèi)電子產(chǎn)品中,往往都會(huì)用到音頻系統(tǒng)來(lái)播放音樂(lè)、進(jìn)行通話(huà)等多媒體應(yīng)用,此外,對(duì)于一些需語(yǔ)音提示的產(chǎn)品,音頻部分都是不可或缺的功能。筆者此處就s3c2416的音頻驅(qū)動(dòng)實(shí)現(xiàn)作一個(gè)簡(jiǎn)單的介紹。1. IIS音頻總線(xiàn)s3c24

關(guān)鍵字: s3c2416 裸機(jī)開(kāi)發(fā) 音頻驅(qū)動(dòng)

S3C2416裸機(jī)開(kāi)發(fā)系列十八_音頻驅(qū)動(dòng)實(shí)現(xiàn)(2)標(biāo)簽:WM8960IIS音頻驅(qū)動(dòng)s3c2416裸機(jī)開(kāi)發(fā)2014-06-10 09:50853人閱讀評(píng)論(0)收藏舉報(bào)分類(lèi):s3c2416裸機(jī)開(kāi)發(fā)(24)版權(quán)聲明:本文為博...

關(guān)鍵字: s3c2416 裸機(jī)開(kāi)發(fā) 音頻驅(qū)動(dòng)

很多的嵌入式系統(tǒng)都需要人機(jī)交互,對(duì)于輸出設(shè)備,LCD以其顯示質(zhì)量高、畫(huà)面效果好等優(yōu)點(diǎn)得到了極其廣泛的應(yīng)用。s3c2416包含了一個(gè)LCD控制器,筆者此處就s3c2416的LCD應(yīng)用作一個(gè)簡(jiǎn)單的介紹。1、LCD控制器概述1...

關(guān)鍵字: s3c2416 裸機(jī)開(kāi)發(fā) rgb屏 驅(qū)動(dòng)顯示

在嵌入式設(shè)計(jì)中,由于Nand Flash具有大容量,擦寫(xiě)次數(shù)高,接口簡(jiǎn)單等優(yōu)點(diǎn),常用作固化存儲(chǔ)器。S3C2416支持Nand啟動(dòng),因此Nand存儲(chǔ)器可以直接保存固化代碼以及其它的數(shù)據(jù)。筆者在此簡(jiǎn)單的介紹Nand flas...

關(guān)鍵字: nand驅(qū)動(dòng) s3c2416 裸機(jī)開(kāi)發(fā) nand啟動(dòng)

筆者前面章節(jié)簡(jiǎn)單介紹了s3c2416啟動(dòng)代碼的實(shí)現(xiàn)過(guò)程,啟動(dòng)代碼就是用來(lái)處理cpu體系結(jié)構(gòu)中一些底層內(nèi)容,一個(gè)功能強(qiáng)大的啟動(dòng)代碼是可以當(dāng)作bootloader(如uboot)來(lái)用的。有了啟動(dòng)代碼,用戶(hù)就可以專(zhuān)注于用c來(lái)作...

關(guān)鍵字: mdk s3c2416 啟動(dòng)代碼 裸機(jī)開(kāi)發(fā)

啟動(dòng)代碼是處理器上電復(fù)位后最先運(yùn)行的一段代碼。主要是用來(lái)把處理器初始化到一個(gè)確定的狀態(tài),為c運(yùn)行環(huán)境作好準(zhǔn)備。如設(shè)置異常向量表,初始化系統(tǒng)時(shí)鐘,初始化外部?jī)?nèi)存,把用戶(hù)代碼拷貝到外部?jī)?nèi)存,初始化棧,清0全

關(guān)鍵字: s3c2416 啟動(dòng)代碼 流水燈 裸機(jī)開(kāi)發(fā)

S3C2416裸機(jī)開(kāi)發(fā)系列十九_(tái)Fatfs下播放錄音wav音頻文件標(biāo)簽:wavfatfs音頻播放s3c2416sd驅(qū)動(dòng)2014-06-11 09:551938人閱讀評(píng)論(0)收藏舉報(bào)分類(lèi):s3c2416裸機(jī)開(kāi)發(fā)(24)版...

關(guān)鍵字: s3c2416 裸機(jī)開(kāi)發(fā) 播放錄音 音頻文件

對(duì)于處理器來(lái)說(shuō),都不可能內(nèi)置過(guò)大的內(nèi)存,只保留一小塊SRAM作為芯片啟動(dòng)用。例如S3C2416內(nèi)部SRAM只有64k,其中8k是作為SteppingStone,用來(lái)做一些基本的初始化,并進(jìn)一步引導(dǎo)用戶(hù)的代碼啟動(dòng)。用戶(hù)的代...

關(guān)鍵字: s3c2416 初始化 裸機(jī)開(kāi)發(fā) 外部?jī)?nèi)存 代碼搬移
關(guān)閉