給大家分享一個IIC_EEPROM_24LC64存儲芯片與TMS320F2812 dsp讀寫操作的源碼
dsp源程序如下:
- /*********************************************************************
- ** 實驗目的:學習IIC接口的EEPROM數據讀寫 **
- ** 實驗說明:EEPROM采用24LC64芯片,串行數據線和串行時鐘線分別由DSP的 **
- ** PA13和PA15控制 **
- ** 實驗結果:按照我們下面所設置的斷點運行可讀出我們寫入EEPROM里的值 ** **
- **********************************************************************/
- #include "DSP28_Device.h"
- #include "DSP28_Globalprototypes.h"
- #define SDA1 GpioDataRegs.GPADAT.bit.GPIOA13 = 1////串行數據輸出高
- #define SDA0 GpioDataRegs.GPADAT.bit.GPIOA13 = 0////串行數據輸出低
- #define SCL1 GpioDataRegs.GPADAT.bit.GPIOA15 = 1////串行時鐘輸出高
- #define SCL0 GpioDataRegs.GPADAT.bit.GPIOA15 = 0////串行時鐘輸出低
-
- #define SDAIN EALLOW;GpioMuxRegs.GPADIR.bit.GPIOA13 = 0; EDIS
- #define SDAOUT EALLOW;GpioMuxRegs.GPADIR.bit.GPIOA13 = 1;EDIS
- #define SDADATA GpioDataRegs.GPADAT.bit.GPIOA13
- //24C64 =8K Bytes =13bit Add
- //頁編程平均400us寫一字節,隨機讀平均1.8ms讀一字節,連續讀平均600us一字節
- #define uchar unsigned char /*宏定義*/
- #define uint unsigned int
- void delay(unsigned int t);
- unsigned char ByteRead(unsigned int add,unsigned char *temp);
- unsigned char ByteWrite(unsigned int add,unsigned char dat);
- void main(void)
- {
- unsigned char t,s,a;
- /*初始化系統*/
- InitSysCtrl();
- /*關中斷*/
- DINT;
- IER = 0x0000;
- IFR = 0x0000;
- /*初始化PIE*/
- InitPieCtrl();
- /*初始化PIE中斷矢量表*/
- InitPieVectTable();
-
-
- InitGpio();
- SDA1;
- SCL1;
- t=0;
- s=ByteWrite(0,0x12);
- delay(10000);
- s=ByteRead(0,&t);
- a=0;//設斷點,看變量t的值
- s=ByteWrite(1,0x34);
- delay(10000);
- s=ByteRead(1,&t);
- a=1; //設斷點
- s=ByteWrite(2,0x56);
- delay(10000);
- s=ByteRead(2,&t);
- a=2; //設斷點
- s=ByteWrite(3,0x78);
- delay(10000);
- s=ByteRead(3,&t);
- a=3; //設斷點
- for(;;);
- }
- void delay(unsigned int t)
- {
- while(t>0) t--;
-
- }
- //總線無效期間二線全為主高,總線有效期間時鐘線為低,一個高低跳變為一個時鐘
- //周期,時鐘線為低時才能改變數據線狀態,若時鐘線為高時改變數據線狀態,則只
- //能是開始或結束總線操作
- unsigned char ack; /*應答標志位*/
-
- /*******************************************************************
- 起動總線函數
- 時鐘線在高電平時,數據線從高向低的跳變開始總線,最終二線全變低
- 函數原型: void Start_I2c();
- 功能: 啟動I2C總線,即發送I2C起始條件.
- ********************************************************************/
- void Start_I2c()
- {
- SDA1; /*先跳高,為稍后的從高向低跳作準備*/
- delay(60);
- SCL1;
- delay(500); /*起始條件建立時間大于4.7us,延時*/
- SDA0; /*發送起始信號*/
- delay(60); /* 起始條件鎖定時間大于4μs*/
- SCL0; /*鉗住I2C總線,準備發送或接收數據 */
- delay(60);
- }
- /*******************************************************************
- 結束總線函數
- 時鐘線在低電平時,數據線從低向高的跳變結束總線,最終二線都變高
- 函數原型: void Stop_I2c();
- 功能: 結束I2C總線,即發送I2C結束條件.
- ********************************************************************/
- void Stop_I2c()
- {
- SDA0; /*先跳低,為稍后的從低向高跳變作準備*/
- delay(60);
- SCL1; /*發送結束條件的時鐘信號,結束條件建立時間大于4μs*/
- delay(60);
- SDA1; /*發送I2C總線結束信號*/
- delay(60);
- }
- /*******************************************************************
- 字節數據發送函數
- 函數原型: void SendByte(uchar c);
- 功能: 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
- 此狀態位進行操作.(不應答或非應答都使ack=0)
- 發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
- ********************************************************************/
- unsigned char SendByte(uchar c)
- {
- uchar BitCnt,t[8];
- for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送的數據長度為8位*/
- {
- if((c<<BitCnt)&0x80)
- t[BitCnt]=1; /*判斷發送位*/
- else
- t[BitCnt]=0;
- }
-
- SCL0;
- delay(4);
- for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送的數據長度為8位*/
- { SCL0;
- if(t[BitCnt])SDA1; /*判斷發送位*/
- else SDA0;
- delay(60);
- SCL1; /*置時鐘線為高,通知被控器開始接收數據位*/
- delay(60); /*保證時鐘高電平周期大于4μs*/
-
- // if((BitCnt==7) && t[BitCnt])
- // SDAIN; //設為輸入
- }
-
- SCL0;
- SDAIN; //設為輸入
- delay(60);
- SCL1;
- if(SDADATA)ack=1; //沒有收到應答信號
- else ack=0; //收到應答信號
- delay(60);
- SCL0;
- delay(60);
- SDAOUT; //重新設為輸出
-
-
- return ack;
- }
- /*******************************************************************
- 字節數據接收函數
- 函數原型: uchar RcvByte();
- 功能: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
- 發完后請用應答函數應答從機。
- ********************************************************************/
- uchar RcvByte()
- {
- uchar retc;
- uchar BitCnt;
-
- retc=0;
- SCL0; //先將時鐘線拉低
- SDAIN; /*置數據線為輸入方式*/
- for(BitCnt=0;BitCnt<8;BitCnt++)
- {
- SCL0; /*置時鐘線為低,準備接收數據位*/
- delay(60); /*時鐘低電平周期大于4.7μs*/
- SCL1; /*置時鐘線為高使數據線上數據有效*/
- retc=retc<<1;
- if(SDADATA)
- retc=retc+1; /*讀數據位,接收的數據位放入retc中 */
- delay(60);
- }
- SCL0; //從器件數據輸了階段在這一位后沒有響應,數據線補外部上拉電阻臨時拉為高
-
- delay(60);
- SDAOUT;
- return(retc);
-
- }
- /*******************************************************************
- 接口函數
- *******************************************************************/
- unsigned char ByteRead(unsigned int add,unsigned char *temp)
- {
- unsigned char rt;
- rt=0;
- Start_I2c(); /*啟動總線*/
- if(SendByte(0xa0)) /*發送寫命令*/
- rt=1;
- if(SendByte(add>>8)) //發送地址
- rt= 2;
- if(SendByte(add)) //發送地址
- rt= 3;
- Start_I2c(); /*啟動總線*/
- if(SendByte(0xa1)) //發送讀命令
- rt= 4;
-
- *temp=RcvByte();
-
- Stop_I2c(); /*結束總線*/
-
- return rt;
- }
- unsigned char ByteWrite(unsigned int add,unsigned char dat)
- {
- unsigned char rt;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
IIC_EEPROM_24LC64芯片與TMS320F2812完成讀寫操作.rar
(250.44 KB, 下載次數: 63)
2018-7-12 12:08 上傳
點擊文件名下載附件
|