国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

ARM入門筆記(9)

發布時間:2010-8-26 17:31    發布者:絕對好文
關鍵詞: ARM入門筆記
第十章 I2C接口實驗

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

一.實驗目的

能夠正確讀寫I2C接口芯片存儲器(24C02),即寫入24C02的數據與讀出來的數據相同。

二.實驗程序和參數設置

1> 連接器選項設置和啟動代碼與上一個實驗相同
2> I2C驅動程序

ATMEL官方網站上有這方便的參考程序。主要由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外圍時鐘
AT91F_TWI_Configure (AT91C_BASE_TWI);  //將TWI設置成主模式
AT91F_SetTwiClock(AT91C_BASE_TWI);   //計算、設置時鐘發生寄存器
}
//*----------------------------------------------------------------------------
//* \fn    AT91F_SetTwiClock
//*計算、設置TWI時鐘發生寄存器
//*----------------------------------------------------------------------------
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> 主函數

在主函數中,首先調用了TWI的初始化函數,然后進入了超級大循環。在每次寫和讀時,都對它們的數據緩沖區進行初始化,以查看讀、寫的正確性。

#i nclude "board.h"
#i nclude "twi.h"
int main ( void )
{ int loop,index=0;
char Wri_data[16], Red_data[16];  //定義寫和讀緩沖區
InitTwi();      //TWI初始化
while (1)
{ for (loop = 0; loop 初始化寫和讀緩沖區的內容
   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);//讀
}//用單步調試,可比較Wri_data[16]和 Red_data[16]的內容來判斷讀寫是否正確。
}

三.出現的問題與解決方法

1> 無論寫入任何數據,讀出來都是同樣的數,表明數據沒有寫入(在調試時對其寫操作,器件沒有產生應答)。

原因是24C02的寫保護管腳沒有接地,內部的數據被寫保護了。注意:有些廠家的EEROM的該管腳處于懸空時為不保護狀態,而有些廠家的EEROM會處于保護狀態,因此在用之前一定要仔細閱讀廠家的數據手冊,或不要將該腳懸空。

2> 對24WC02寫的數據和讀的數據不一樣。

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

3> 當寫入16字節數據,再讀出16字節數據時,最后一個字節總為0。

原因是TWI Master Mode Register的IADRSZ(器件內部地址長度)設成了兩個字節(Two-byte),要將改成一個字節(One-byte)。
本文地址:http://m.qingdxww.cn/thread-23786-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
長話短說 發表于 2010-9-4 11:35:46
謝謝
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费国产成人午夜私人影视 | 久久综合精品国产一区二区三区无 | 精品国产一区二区 | 黄毛片在线观看 | 日韩在线免费看网站 | 男女www视频在线看网站 | 三a级毛片| 国产美女福利在线 | 色多多幸福宝 | 久久综合图片 | 在线观看欧美日韩 | 国产女主播91 | 日日日日日日日 | 国产色司机在线视频免费观看 | bluemv.tips下载 | 国产精品所毛片视频 | 一级做a爰片性色毛片黄书 一级做a爰片欧美一区 | 在线看片 在线播放 | 在线免费不卡视频 | 日韩高清片 | 新国产视频 | 在线天堂最新版资源下载 | 9久热久爱免费精品视频在线观看 | 久久99蜜桃精品久久久久小说 | 日日干天天草 | 国产一区福利 | 日本黄色小视频网站 | 色噜噜狠狠狠综合曰曰曰 | 欧美网站视频 | 视频一区二区三区欧美日韩 | 日韩专区第一页 | 国产欧美日韩在线观看精品 | 91视频麻豆| 欧美一区视频在线 | 成人97在线观看免费高清 | 性欧美嫩交hd | 不卡在线一区 | 欧美日韩色黄大片在线视频 | 亚洲一区二区视频在线观看 | 九九热这里只有国产精品 | 亚洲羞羞视频 |