91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 532KB
    文件類型: .rar
    金幣: 2
    下載: 0 次
    發布日期: 2021-05-12
  • 語言: 其他
  • 標簽: AT24C08??I2C??驅動??

資源簡介

EEPROM是一種掉電后數據不丟失的存儲器,常用來存儲一些配置信息,以便系統重新上電的時候加載之。EEPROM芯片最常用的通訊方式是IIC協議。此代碼為AT24C08的I2C驅動程序,其他型號可按照規格書自行擴展

資源截圖

代碼片段和文件信息

#include?“AT24C08.h“

static?void?I2C_START(){
??IIC_SDA_H;
??IIC_SCL_H;
??halMcuWaitUs(5);
??IIC_SDA_L;
??halMcuWaitUs(4);
??IIC_SCL_L;
}

static?void?I2C_STOP(){
??IIC_SDA_L;
??halMcuWaitUs(2);
??IIC_SCL_H;
??halMcuWaitUs(4);
??IIC_SDA_H;
??halMcuWaitUs(5); //到下一次開始的總線最短空閑時間4.7us
}

//低電平應答,返回1表示無應答
static?uint8?I2C_WaitAck(void)
{
????IIC_SDA_H;
????IIC_SCL_H;
????halMcuWaitUs(5);
????if(IIC_SDA_VALUE)
????????return?1;
????IIC_SCL_L;
????halMcuWaitUs(5);
????return?0;
}

static?void?I2C_SendAck(void)
{
????IIC_SCL_L;
????IIC_SDA_L;
????halMcuWaitUs(5);
????IIC_SCL_H;
????halMcuWaitUs(4);
????IIC_SCL_L;
}

static?void?I2C_SendNoAck(void)
{
????IIC_SCL_L;
????IIC_SDA_H;
????halMcuWaitUs(5);
????IIC_SCL_H;
????halMcuWaitUs(4);
????IIC_SCL_L;
}


void?I2C_WRITE(uint8?byte){
????uint8?Cnt;
????IIC_SDA_OUT;
????IIC_SCL_L;
????halMcuWaitUs(1);
????for(Cnt=0;Cnt<8;Cnt++)
????{
????????if(byte&0x80)
????????{
????????????IIC_SDA_H;
????????}
????????else
????????{
????????????IIC_SDA_L;
????????}
????????byte<<=1;
????????halMcuWaitUs(5);
????????IIC_SCL_H;
????????halMcuWaitUs(5);
????????IIC_SCL_L;
????}
}

uint8?I2C_READ(){
????uint8?CntByte=0;
????IIC_SDA_H;
????IIC_SDA_IN;
????halMcuWaitUs(2);
????for(Cnt=0;Cnt<8;Cnt++)
????{
????????Byte<<=1;
????????IIC_SCL_H;
????????halMcuWaitUs(5);
????????if(IIC_SDA_VALUE)
????????????Byte++;
????????IIC_SCL_L;
????????halMcuWaitUs(5);
????}
????IIC_SDA_OUT;
????return?Byte;
}







//寫單個字節(設備地址+寄存器地址+單字節數據+停止位)數據地址為0-0xff每個地址存儲一個8位字節
//at24c08設備地址第二三位表示存儲陣列地址08總共有1k字節,共有四個區域,每個存儲區域256字節,所以area-->?00?01?10?11
uint8?writeOneByte(uint8?Reguint8?RegValuint8?area)
{
????I2C_START();
????I2C_WRITE(IIC_WRITE_ADDR|(area<<1));
????if(I2C_WaitAck())
????????return?1;
????I2C_WRITE(Reg);
????if(I2C_WaitAck())
????????return?1;
????I2C_WRITE(RegVal);
????if(I2C_WaitAck())
????????return?1;
????I2C_STOP();
????return?0;
}?


//讀單個字節,讀取完成后主機不需要應答,只需要停止信號
//Reg?要讀的寄存器的地址
//RegVal?讀出來的數據保存的地址
//0?成功??1失敗
uint8?readOneByte(uint8?Reguint8?*RegValuint8?area)
{
????I2C_START();
????I2C_WRITE(IIC_WRITE_ADDR|(area<<1));
????if(I2C_WaitAck())
????????return?1;
????
????I2C_WRITE(Reg);
????if(I2C_WaitAck())
????????return?1;
????
????I2C_START();
????I2C_WRITE(IIC_READ_ADDR|(area<<1));
????if(I2C_WaitAck())
????????return?1;
????*RegVal=I2C_READ();
????I2C_SendNoAck();
????I2C_STOP();
????return?0;
}




//連續寫多個字節(寫地址自動累加,最大16字節,多的將會覆蓋之前的數據)
//設備地址+寄存器地址+多字節數據+停止位
uint8?writeMutipleDatas(uint8?Reguint8*?RegValuint8?countuint8?area){
uint8?i?=?0;
????if(count>16)
????????return?1;
I2C_START();
????I2C_WRITE(IIC_WRITE_ADDR|(area<<1));
????if(I2C_WaitAck())
????????return?1;
????I2C_WRITE(Reg);
????if(I2C_WaitAck())
????????return?1;
for(;i I2C_WRITE(RegVal[i]);
if(I2C_WaitAck())return?1;
}
I2C_STOP();
????return?0;
}




//連續讀多個

?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----

?????文件?????667886??2018-11-15?18:30??AT24系列E2PROM\AT24c02中文官方資料手冊pdf.pdf

?????文件???????4538??2018-11-21?14:47??AT24系列E2PROM\AT24C08.c

?????文件???????1060??2018-11-16?08:50??AT24系列E2PROM\AT24C08.h

?????目錄??????????0??2018-11-26?17:57??AT24系列E2PROM

-----------?---------??----------?-----??----

???????????????673484????????????????????4


評論

共有 條評論