国产精品免费无遮挡无码永久视频-国产高潮视频在线观看-精品久久国产字幕高潮-国产精品99精品无码视亚

ARM入門筆記(9)

發(fā)布時(shí)間:2010-8-26 17:31    發(fā)布者:絕對(duì)好文
關(guān)鍵詞: ARM入門筆記
第十章 I2C接口實(shí)驗(yàn)

注:在AT91SAM7Sxx系列中,I2C稱作TWI。

一.實(shí)驗(yàn)?zāi)康?br />
能夠正確讀寫I2C接口芯片存儲(chǔ)器(24C02),即寫入24C02的數(shù)據(jù)與讀出來(lái)的數(shù)據(jù)相同。

二.實(shí)驗(yàn)程序和參數(shù)設(shè)置

1> 連接器選項(xiàng)設(shè)置和啟動(dòng)代碼與上一個(gè)實(shí)驗(yàn)相同
2> I2C驅(qū)動(dòng)程序

ATMEL官方網(wǎng)站上有這方便的參考程序。主要由I2C接口的初始化、I2C的讀和寫三部分組成。

#i nclude "board.h"
#i nclude "twi.h"
void InitTwi(void)
{ AT91F_TWI_CfgPIO();      //配置TWI的TWD和TWCK管腳 AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA,(unsigned int)AT91C_PA3_TWD);  
AT91F_TWI_CfgPMC ();      //使能TWI外圍時(shí)鐘
AT91F_TWI_Configure (AT91C_BASE_TWI);  //將TWI設(shè)置成主模式
AT91F_SetTwiClock(AT91C_BASE_TWI);   //計(jì)算、設(shè)置時(shí)鐘發(fā)生寄存器
}
//*----------------------------------------------------------------------------
//* \fn    AT91F_SetTwiClock
//*計(jì)算、設(shè)置TWI時(shí)鐘發(fā)生寄存器
//*----------------------------------------------------------------------------
void AT91F_SetTwiClock(const AT91PS_TWI pTwi)
{ int sclock;
sclock = (10*MCK /AT91C_TWI_CLOCK);
sclock = (MCK /AT91C_TWI_CLOCK);
if (sclock % 10 >= 5)
  sclock = (sclock /10) - 5;
else
sclock = (sclock /10)- 6;
sclock = (sclock + (4 - sclock %4)) >> 2; // div 4
    pTwi->TWI_CWGR = 0x00010000 | sclock | (sclock
}
//*----------------------------------------------------------------------------
//* \fn    AT91F_TWI_Write
//* \brief Send n bytes to a slave device
//*----------------------------------------------------------------------------
int AT91F_TWI_Write(const AT91PS_TWI pTwi ,int address, char *data2send, int size)
{ unsigned int status;
pTwi->TWI_MMR=(AT91C_EEPROM_I2C_ADDRESS| AT91C_TWI_IADRSZ_1_BYTE ) & ~AT91C_TWI_MREAD;  
pTwi->TWI_IADR = address; // Set TWI Internal Address Register
status = pTwi->TWI_SR;
pTwi->TWI_THR = *(data2send++);
pTwi->TWI_CR = AT91C_TWI_START;
while (size-- >1){  // Wait THR Holding register to be empty
  while (!(pTwi->TWI_SR & AT91C_TWI_TXRDY));
  pTwi->TWI_THR = *(data2send++);// Send first byte
}
pTwi->TWI_CR = AT91C_TWI_STOP;   
status = pTwi->TWI_SR;
while (!(pTwi->TWI_SR & AT91C_TWI_TXCOMP)); // Wait transfer is finished   
return AT91C_EEPROM_WRITE_OK;
}
//*----------------------------------------------------------------------------
//* \fn    AT91F_TWI_Read
//* \brief Read n bytes from a slave device
//*----------------------------------------------------------------------------
int AT91F_TWI_Read(const AT91PS_TWI pTwi , int address, char *data2rec, int size)
{ unsigned int status;  
pTwi->TWI_MMR=(AT91C_EEPROM_I2C_ADDRESS|AT91C_TWI_IADRSZ_1_BYTE) | AT91C_TWI_MREAD; // Set the TWI Master Mode Register
pTwi->TWI_IADR = address; // Set TWI Internal Address Register
pTwi->TWI_CR = AT91C_TWI_START; // Start transfer
status = pTwi->TWI_SR;
while (size-- >1){ // Wait RHR Holding register is full
  while (!(pTwi->TWI_SR & AT91C_TWI_RXRDY));  
  *(data2rec++) = pTwi->TWI_RHR; // Read byte
}
pTwi->TWI_CR = AT91C_TWI_STOP;
status = pTwi->TWI_SR;
    while (!(pTwi->TWI_SR & AT91C_TWI_TXCOMP)); // Wait transfer is finished
*data2rec = pTwi->TWI_RHR; // Read last byte
return AT91C_EEPROM_READ_OK;
}

3> 主函數(shù)

在主函數(shù)中,首先調(diào)用了TWI的初始化函數(shù),然后進(jìn)入了超級(jí)大循環(huán)。在每次寫和讀時(shí),都對(duì)它們的數(shù)據(jù)緩沖區(qū)進(jìn)行初始化,以查看讀、寫的正確性。

#i nclude "board.h"
#i nclude "twi.h"
int main ( void )
{ int loop,index=0;
char Wri_data[16], Red_data[16];  //定義寫和讀緩沖區(qū)
InitTwi();      //TWI初始化
while (1)
{ for (loop = 0; loop 初始化寫和讀緩沖區(qū)的內(nèi)容
   data1[loop] = loop + index;
   data2[loop] = 0;
  }
  index += 1;
  AT91F_TWI_Write(AT91C_BASE_TWI, 0x0, Wri_data, EEP_RW_CHK_CNT);//寫
  AT91F_TWI_Read(AT91C_BASE_TWI, 0x0, Red_data, EEP_RW_CHK_CNT);//讀
}//用單步調(diào)試,可比較Wri_data[16]和 Red_data[16]的內(nèi)容來(lái)判斷讀寫是否正確。
}

三.出現(xiàn)的問(wèn)題與解決方法

1> 無(wú)論寫入任何數(shù)據(jù),讀出來(lái)都是同樣的數(shù),表明數(shù)據(jù)沒(méi)有寫入(在調(diào)試時(shí)對(duì)其寫操作,器件沒(méi)有產(chǎn)生應(yīng)答)。

原因是24C02的寫保護(hù)管腳沒(méi)有接地,內(nèi)部的數(shù)據(jù)被寫保護(hù)了。注意:有些廠家的EEROM的該管腳處于懸空時(shí)為不保護(hù)狀態(tài),而有些廠家的EEROM會(huì)處于保護(hù)狀態(tài),因此在用之前一定要仔細(xì)閱讀廠家的數(shù)據(jù)手冊(cè),或不要將該腳懸空。

2> 對(duì)24WC02寫的數(shù)據(jù)和讀的數(shù)據(jù)不一樣。

原因是I2C的時(shí)鐘太快。在本實(shí)驗(yàn)程序中,可以減少twi.h中的AT91C_TWI_CLOCK常量的數(shù)值。或者直接在程序中修改TWI時(shí)鐘波形發(fā)生寄存器TWI_CWGR。

3> 當(dāng)寫入16字節(jié)數(shù)據(jù),再讀出16字節(jié)數(shù)據(jù)時(shí),最后一個(gè)字節(jié)總為0。

原因是TWI Master Mode Register的IADRSZ(器件內(nèi)部地址長(zhǎng)度)設(shè)成了兩個(gè)字節(jié)(Two-byte),要將改成一個(gè)字節(jié)(One-byte)。
本文地址:http://m.4huy16.com/thread-23786-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
長(zhǎng)話短說(shuō) 發(fā)表于 2010-9-4 11:35:46
謝謝
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 常見深度學(xué)習(xí)模型介紹及應(yīng)用培訓(xùn)教程
  • “芯”光璀璨,鵬城共賞——2025 Microchip中國(guó)技術(shù)精英年會(huì)深圳站回顧
  • Microchip第22屆中國(guó)技術(shù)精英年會(huì)——采訪篇
  • 電動(dòng)兩輪車設(shè)計(jì)生態(tài)系統(tǒng)
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表