|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
ARM2214的I2C接at24c1024問題???? |
| 作者:andreas168 欄目:ARM技術(shù) |
我以前購買的是EASYARM2104的開發(fā)板,上面有I2C接24C02的代碼,但我現(xiàn)在的項(xiàng)目中要使用AT24C1024,必須在讀寫時寫入16位的數(shù)據(jù)地址,我對 void __irq IRQ_I2C(void) 這段代碼理解不夠,所以不知道如何修改,請各位大俠幫忙。謝謝。 QQ:359473028。 /**************************************************************************** * File:I2CINT.C * 功能:使用硬件I2C對E2PROM進(jìn)行操作,利用中斷方式操作。 * 說明:將跳線器JP8_LED1、JP12短接。 ****************************************************************************/ #include "config.h" #define CSI24WC02 0xA0 /* 定義器件地址 */ #define LED1CON 0x00000400 /* P0.10引腳控制LED1,低電平點(diǎn)亮 */ /* 以下為I2C操作時所需要的變量,在調(diào)用I2C子程序前要設(shè)置好這些變量 */ volatile uint8 I2C_sla; // 從機(jī)地址 volatile uint8 I2C_suba; // 子地址 volatile uint8 *I2C_buf; // 數(shù)據(jù)緩沖區(qū)指針 (讀操作時會被更改) volatile uint8 I2C_num; // 操作數(shù)據(jù)個數(shù) (會被更改) volatile uint8 I2C_end; // 操作結(jié)束標(biāo)志,為1時表示操作結(jié)束,為0xFF時表示操作失敗 (會被設(shè)置) volatile uint8 I2C_suba_en; // 子地址使能控制,讀操作時請設(shè)置為1,寫操作時請設(shè)置為2 (會被更改) /**************************************************************************** * 名稱:IRQ_I2C() * 功能:I2C中斷,通過判斷I2C狀態(tài)字進(jìn)行相應(yīng)的操作。 * 入口參數(shù):無 * 出口參數(shù):無 ****************************************************************************/ void __irq IRQ_I2C(void) { uint8 sta; sta = I2STAT; // 讀出I2C狀態(tài)字 SWITCH(sta) { case 0x08: // 己發(fā)送起始條件 if(1==I2C_suba_en) I2DAT = I2C_sla&0xFE; // 指定子地址讀時,先寫入地址 else I2DAT = I2C_sla; // 否則直接發(fā)送從機(jī)地址 I2CONCLR = 0x28; // SI=0 break; case 0x10: I2DAT = I2C_sla; // 重啟動總線后,發(fā)送從地址 I2CONCLR = 0x28; // SI=0 break; case 0x18: // 已發(fā)送SLA+W,并已接收應(yīng)答 if(0==I2C_suba_en) // 無子地址,則直接發(fā)送數(shù)據(jù) { if(I2C_num>0) { I2DAT = *I2C_buf++; I2CONCLR = 0x28; I2C_num--; } else { I2CONSET = 0x10; // 無數(shù)據(jù)發(fā)送,結(jié)束總線 I2CONCLR = 0x28; I2C_end = 1; // 設(shè)置總線操作結(jié)束標(biāo)志 } break; } if(1==I2C_suba_en) // 發(fā)送子地址 { I2DAT = I2C_suba; I2CONCLR = 0x28; } if(2==I2C_suba_en) { I2DAT = I2C_suba; I2CONCLR = 0x28; I2C_suba_en = 0; // 子地址己處理 } break; case 0x28: // 已發(fā)送I2C數(shù)據(jù),并接收到應(yīng)答 if(0==I2C_suba_en) // 無子地址,則直接發(fā)送數(shù)據(jù) { if(I2C_num>0) { I2DAT = *I2C_buf++; I2CONCLR = 0x28; I2C_num--; } else { I2CONSET = 0x10; // 無數(shù)據(jù)發(fā)送,結(jié)束總線 |
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號 |