I2C讀寫EEPROM文檔說明_第1頁
I2C讀寫EEPROM文檔說明_第2頁
I2C讀寫EEPROM文檔說明_第3頁
I2C讀寫EEPROM文檔說明_第4頁
I2C讀寫EEPROM文檔說明_第5頁
已閱讀5頁,還剩1頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、通過I2C通訊協議對EEPROM進行讀寫操作發送串口進行通訊一.描述I2CI2C協議有啟動,終止,應答,非應答四種信號,有按位發送數據,按位接收數據,有讀操作和寫操作。1. 啟動I2C程序如下,保持SCL為高電平,SDA為高電平,當檢測到SDA下降沿時,啟動傳送,如果2個信號沒有被高則返回0。程序啟動成功返回1。uint8 I2C_Start(void)CyDelayUs(10);SDA_Write(1);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);if ( SDA_Read() = 0) return 0;if ( SCL_Read() = 0) ret

2、urn 0;SDA_Write(0);CyDelayUs(10);SCL_Write(0);CyDelayUs(10);return 1;上面是模仿I2C啟動時序 2. 終止傳送程序如下SDA保持低電平 SCL保持高電平而后拉高SDA,系統檢測到SDA上升沿則終止傳送。void I2C_Stop(void)CyDelayUs(10);SDA_Write(0);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SDA_Write(1);CyDelayUs(10);3. 模擬應答信號,讓SDA的低電平時間大于SCL的高電平時間,即可應答;也就是SDAvoid I2C

3、_Ack(void)CyDelayUs(10);SDA_Write(0);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SCL_Write(0);CyDelayUs(10);4. 模擬非應答信號,讓SDA的高電平時間大于SCL高電平時間,就是非應答void I2C_Nack(void)CyDelayUs(10);SDA_Write(1);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SCL_Write(0);CyDelayUs(10);5. 按位發送數據,按位發送數據的要求是數據位高電平的時間大于SCL,SCL高電平時不允

4、許數據位電平變化,只有SCL低電平時才可以任意變換。uint8 I2C_Send_Byte( uint8 d)uint8 i = 8;uint8 bit_ack = 0;while( i- ) /循環發送八個位CyDelayUs(10);if ( d &0x80 ) SDA_Write(1); /按字節與 else SDA_Write(0);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SCL_Write(0);d = d << 1; CyDelayUs(10);SDA_Write(1);CyDelayUs(10);SCL_Write(1

5、);CyDelayUs(10);bit_ack = SDA_Read();SCL_Write(0);CyDelayUs(10);return bit_ack;6. 按位接收數據uint8 I2C_Receive_Byte(void)uint8 i = 8, d;CyDelayUs(10);SDA_Write(1); /SDA拉高while ( i-)d = d << 1;CyDelayUs(10);SCL_Write(1);if ( SDA_Read() ) d+;CyDelayUs(10);SCL_Write(0);return d;7. 對EEPROM進行寫操作,送入寫指令即可

6、進行寫操作void AT24C128_W(uint8 *mcu_address, uint16 AT24C128_address, uint16 count ) /(內存中數據的首地址,eeprom地址,寫入的字符數)while(count-) /count是存放的數據串長度I2C_Start(); /啟動信號I2C_Send_Byte( 0xa0 );/發送一字節控制指令I2C_Send_Byte( AT24C128_address/256 );I2C_Send_Byte( AT24C128_address %256 );I2C_Send_Byte( *mcu_address );/ *mc

7、u_address存數數據的首指針I2C_Stop(); /停止信號CyDelay(10); /* waiting for write cycle to be completed */mcu_address+; /指針加1AT24C128_address+;/存儲數據的EEPROM的地址加1,8. ,必須先寫入讀指令才能進行讀取void AT24C128_R(uint8 *mcu_address,uint16 AT24C128_address,uint16 count) /(存放緩存數據的地址,eeprom地址,讀取的字符長度)while(count-)I2C_Start();I2C_Send

8、_Byte( 0xa0 ); /發送寫指令I2C_Send_Byte( AT24C128_address/256 ); /送入指令I2C_Send_Byte( AT24C128_address % 256 );I2C_Start(); /啟動I2C_Send_Byte( 0xa1 ); /輸入讀指令*mcu_address = I2C_Receive_Byte(); /接收一位數據I2C_Nack(); /無應答I2C_Stop(); /停止mcu_address+; /AT24C128_address+;上面是I2C模擬時序的讀寫操作的幾個必須部分。我們要讀寫的時候只需要調用void AT2

9、4C128_W(uint8 *mcu_address, uint16 AT24C128_address, uint16 count )和void AT24C128_R(uint8 *mcu_address,uint16 AT24C128_address,uint16 count)2個函數即可。具體的參數說明我們已經在上面申明了。程序如下:#include <device.h>uint8 An10 = 5,13,5,8,58,6,7,5,8,15,16,25,24,25,26,26,25,25,38,35,33,34,47,45,44,43,44,48,52,44,44,44,59,

10、59,53,55,58,67,64,65,67,62,63,63,61,72,76,71,72,74,71,80,86,83,83,84,86,83,80,86,91,98,94,90,98,95,91,90,98,100,109,101,100,106,104,106,110,117,113,109,116,110,113,113,123,118,126,122,123,124,125,128;uint8 An09 = 19,24,34,49,58,62,71,81,90,19,24,19,24,34,49,59,62,71,9,19,24,34,9,19,24,34,49,59,62,71

11、,81,90,10,19,24,49,59,19,34,49,59,62,71,81,90,9,19,24,34,71,81,9,19,24,34,49,59,62,71,81,9,19,24,34,49,59,62,71,81,9,19,24,34,49,71,81,9,19,24,34,49,62,71,81,24,34,49,59,62,71,81,9;void main() AT24C128_W(An10, 0x00, 92);CyDelay(10); AT24C128_W(An09, 0x5C, 92);/An:為數據的首地址; add:為存放在EEPROM的存放地址;92即存放數組

12、的個數CyDelay(10);UART_1_Start(); for(;) UART_1_WriteTxData(0x08); /發送串口查看程序是否運行到此 功能:把我們寫入EEPROM里的數據讀出來通過串口調試助手顯示出來進行對比,看是否出現錯誤。在psoc中我們可以調用串口模塊如下圖:分配好管腳,分別是P17和P16,我們的硬件電路已經做好了串行口的硬件部分。我們只需要配置,刷完程序即可進行調試。下面是我們進行串口調試的程序:#include <device.h>uint8 i ;uint8 bi = 0;uint16 adda=0;uint16 addb=16284;voi

13、d main() UART_1_Start(); /啟動串口 for(;) for(i=0;i<184;i+)AT24C128_R(&bi, adda, 1); /讀取一個字節的數據放到&b緩存中UART_1_WriteTxData(bi); /調用串口發送程序將數發出去CyDelay(10);adda+;for(i=0;i<184;i+)AT24C128_R(&bi, addb, 1);UART_1_WriteTxData(bi);CyDelay(10);addb+;while(1); 在上面的程序中為了驗證數據的對錯我們二次讀取了不同首地址的數據用以驗證

14、。串口出來的數據如下:FF 05 0D 05 08 3A 06 07 05 08 0F 10 19 18 19 1A 1A 19 19 26 23 21 22 2F 2D 2C 2B 2C 30 34 2C 2C 2C 3B 3B 35 37 3A 43 40 41 43 3E 3F 3F 3D 48 4C 47 48 4A 47 50 56 53 53 54 56 53 50 56 5B 62 5E 5A 62 5F 5B 5A 62 64 6D 65 64 6A 68 6A 6E 75 71 6D 74 6E 71 71 7B 76 7E 7A 7B 7C 7D 80 13 18 22 3

15、1 3A 3E 47 51 5A 13 18 13 18 22 31 3B 3E 47 09 13 18 22 09 13 18 22 31 3B 3E 47 51 5A 0A 13 18 31 3B 13 22 31 3B 3E 47 51 5A 09 13 18 22 47 51 09 13 18 22 31 3B 3E 47 51 09 13 18 22 31 3B 3E 47 51 09 13 18 22 31 47 51 09 13 18 22 31 3E 47 51 18 22 31 3B 3E 47 51 09 00 0A 14 1E 28 32 3C 46 50 5A 64 6E 78 82 8C 96 A0 AA B4 BE C8 D2 DC E6 F0 FA 04 0E 18 22 2C 36 40 4A 54 5E 68 72 7C 86 90 9A A4 AE B8 C2 CC D6 E0 EA F4 FE 08 12 1C 26 30 3A 44 4E 58 62 6C 76 80 8A 94 9E A8 B2 BC C6 D0 DA E4 EE F8 02 0C 16 20 2A 34 3E 48 52 5C 66 70 7A 84 8E 98 A2 AC B6 C0 CA D4 DE 0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論