1. I2C簡介
I2C( Inter-Integrated Circuit)總線是由 PHILIPS 公司開發的兩線式串行總線,用于連接微控制器及其外圍設備。是微電子通信控制領域廣泛采用的一種總線標準。具有接口線少,控制方式簡單,器件封裝形式小,通信速率較高等優點。
I2C特性:
(1)只要求兩條總線線路一條串行數據線SDA,一條串行時鐘線SCL;
(2)每個連接到總線的器件都可以通過唯一的地址和一直存在的簡單的主機/從機關系軟件設定地址,主機可以作為主機發送器或主機接收器;
(3)它是一個真正的多主機總線,如果兩個或更多主機同時初始化數據傳輸可以通過沖突檢測和仲裁防止數據被破壞;
(4)串行的 8 位雙向數據傳輸位速率在標準模式下可達100kbit/s,快速模式下可達400kbit/s,高速模式下可達 3.4Mbit/s;
(5)片上的濾波器可以濾去總線數據線上的毛刺波保證數據完整;
(6)連接到相同總線的IC數量只受到總線的最大電容400pF;
IIC是屬串行通訊總線,同步傳輸、半雙工。
2. I2C總線協議
IIC協議格式:起始信號、停止信號、應答信號、非應答信號、發送數據、接收數據。
??空閑狀態:SCL和SDA均保持高電平;
2.1 起始信號
時鐘為高電平時,數據由高電平變為低電平。
SDA_OUT=1;
SCL=1;
delay_us(2);
SDA_OUT=0;
//方便下一次數據收發
delay_us(2);
SCL=0;
2.2 停止信號
??時鐘線為高電平時,數據線由低變高。
SDA_OUT=0;
SCL=0;
Delay_us(2);
SCL=1;
Delay_us(2);
SDA_OUT=1;
數據傳輸時序:
2.3 獲取應答
??時鐘線為高時讀取數據。應答信號本身就是一位數據。
u8 i=0;
SCL=0;//告訴從機,主機需要讀取數據
Delay_us(2);
SCL=1;//開始讀取數據
while(SDA_IN)
{
i++;
Delay_us(1);
if(i>=20)return 1;//非應答
}
Delay_us(2);
SCL=0;//方便下一次數據收發
return 0;//獲取應答信號
2.4 發送應答(非應答)信號
時鐘線為低電平時發送數據。應答信號本身就是一位數據。
SCL=0;
SDA_OUT=ack&0x01;//ack為應答參數,0為應答,1為非應答
Delay_us(2);
SCL=1;//數據發送完成
//方便下一次數據收發
Delay_us(2);
SCL=0;
2.5 發送一個字節數據
for(i=0;i<8;i++)
{
SCL=0;
if(data&0x80)SDA_OUT=1;
else SDA_OUT=0;
Delay_us(2);
SCL=1;//數據發送完成
data<<=1;
Delay_us(2);
}
SCL=0;//方便下一次數據收發
2.6 接收一個字節數據
u8 data=0;
for(i=0;i<8;i++)
{
SCL=0;//告訴從機,主機需要讀取數據
Delay_us(2);
SCL=1;//主機開始讀取數據
data<<=1;
if(SDA_IN)data|=0x01;
Delay_us(2);
}
SCL=0;//方便下一次數據收發
return data;
3. AT24CXX介紹
?CAT24WC01/02/04/08/16是一個1K/2K/4K/8K/16K位串行CMOS E2PROM。內部含有12/256/512/1024/2048個8位字節,CATALYST公司的先進CMOS技術實質上減少了器件的功耗,CAT24WC01有一個8字節頁寫緩沖器,CAT24WC02/04/08/16有一個16字節頁寫緩沖器,該器件通過I2C總線接口進行操作有一個專門的寫保護功能。
特性
(1)與400KHz I2C總線兼容
(2)1.8到6.0伏工作電壓范圍
(3)低功耗CMOS 技術
(4)寫保護功能當WP為高電平時進入寫保護狀態
(5)頁寫緩沖器
(6)自定時擦寫周期
(7)1,000,000編程/擦除周期
(8)可保存數據100年
(9)8 腳 DIP SOIC或TSSOP封裝
(10)溫度范圍:商業級工業級和汽車級
3.1 引腳說明
3.2 總線時序
??時鐘上升沿讀取數據,下降發送數據。
3.3 從器件地址
3.4 寫操作時序
字節寫
在字節寫模式下,主器件發送起始命令和從器件地址信息(R/W位置零)給從器件在從器件產生應答信號后,主器件發送 CAT24WC01/02/04/08/16的字節地址,主器件在收到從器件的另一個應答信號后,再發送數據到被尋址的存儲單元。AT24WC01/02/04/08/16再次應答,并在主器件產生停止信號后開始內部數據的擦寫,在內部擦寫過程中,CAT24WC01/02/04/08/16不再應答主器件的任何請求。
頁寫
用頁寫, CAT24WC01可一次寫入8個字節數據,CAT24WC02/04/08/16可以一次寫入16個字節的數據。頁寫操作的啟動和字節寫一樣不同在于傳送了一字節數據后并不產生停止信號。主器件被允許發送P(AT24WC01 P=7;AT24WC02/04/08/16 P=15)個額外的字節,每發送一個字節數據后,CAT24WC01/02/04/08/16產生一個應答位并將字節地址低位加1,高位保持不變。
如果在發送停止信號之前,主器件發送超過P+1個字節,地址計數器將自動翻轉,先前寫入的數據被覆蓋。
接收到P+1字節數據和主器件發送的停止信號后,CAT24CXXX啟動內部寫周期將數據寫到數據區。所有接收的數據在一個寫周期內寫入CAT24WC01/02/04/08/16。
3.5 讀操作時序
選擇性讀
選擇性讀操作允許主器件對寄存器的任意字節進行讀操作,主器件首先通過發送起始信號、從器件地址和它想讀取的字節數據的地址執行一個偽寫操作。在 CAT24WC01/02/04/08/16 應答之后,主器件重新發送起始信號和從器件地址,此時R/W 位置1,CAT24WC01/02/04/08/16響應并發送應答信號,然后輸出所要求的一個 8位字節數據,主器件不發送應答信號但產生一個停止信號。
連續讀
連續讀操作可通過立即讀或選擇性讀操作啟動。在CAT24WC01/02/04/08/16發送完一個8位字節數據后,主器件產生一個應答信號來響應,告知CAT24WC01/02/04/08/16 主器件要求更多的數據,對應每個主機產生的應答信號CAT24WC01/02/04/08/16將發送一個8位數據字節。當主器件不發送應答信號而發送停止位時結束此操作。
從CAT24WC01/02/04/08/16 輸出的數據按順序由N到N+1輸出。讀操作時地址計數器CAT24WC01/02/04/08/16整個地址內增加,這樣整個寄存器區域在可在一個讀操作內全部讀出。當讀取的字節超過 E(對于 24WC01,E=127;對24WC02,E=255;對24WC04,E=511;對24WC08,E=1023;對24WC16 E=2047)計數器將翻轉到零并繼續輸出數據字節。
4. EEPROM硬件接口
??在本示例中采用的EEPROM芯片為AT24C08型號,該封裝類型和24C02完全兼容;
??AT24C08容量為8Kbit,即1KB,1024字節;24C02量為2kbit,為256字節。
引腳 | GPIO |
IIC_SCL | 時鐘線PB6 |
IIC_SDA | 雙向數據線PB7 |
5.軟件設置
6.代碼生成
6.1 IIC硬件配置
6.2 IIC硬件產生起始信號、停止信號
//產生起始信號
void IIC_Start(void)
{
hi2c1.Instance->CR1|=1<<8;
while(!(hi2c1.Instance->SR1&1<<0)){}//等待起始信號發送成功
hi2c1.Instance->CR1&=~(1<<8);
}
//停止信號
void IIC_Stop(void)
{
hi2c1.Instance->CR1|=1<<9;
}
6.3 IIC硬件數據收發
//發送數據
void IIC_WriteData(uint8_t data)
{
hi2c1.Instance->DR=data;
while(!(hi2c1.Instance->SR1&1<<7)){}//等待數據發送完成
}
/*發送地址*/
void IIC_WriteAddr(uint8_t adrr)
{
uint8_t stat;
hi2c1.Instance->DR=adrr;
while(!(hi2c1.Instance->SR1&1<<1)){}//等待數據發送完成
stat=hi2c1.Instance->SR2;//對SR2讀取清除標志位
}
uint8_t IIC_readData(void)
{
uint8_t data;
hi2c1.Instance->CR1|=1<<10;//產生應答
while(!(hi2c1.Instance->SR1&1<<6)){}//等待數據到來
data=hi2c1.Instance->DR;
hi2c1.Instance->CR1&=~(1<<10);//取消應答發送
return data;
}
6.4 AT24C08讀寫字節
#define AT24C08_ADDR_W 0xA0 //器件地址+寫使能位
#define AT24C08_ADDR_R 0xA1 //器件地址+讀使能位
/*寫一個字節函數*/
void AT24C08_WriteOneByte(uint8_t addr,uint8_t data)
{
IIC_Start();//發送起始信號
IIC_WriteAddr(AT24C08_ADDR_W);//發送地址
IIC_WriteData(addr);//發送寫入數據地址
IIC_WriteData(data);//寫入數據
IIC_Stop();//停止信號
HAL_Delay(10);//寫周期時間
}
/*讀一個字節函數*/
uint8_t AT24C08_ReadOneByte(uint8_t addr)
{
uint8_t data;
IIC_Start();//發送起始信號
IIC_WriteAddr(AT24C08_ADDR_W);//器件地址+寫使能
IIC_WriteData(addr);//發送寫入數據地址
IIC_Start();//發送起始信號
IIC_WriteAddr(AT24C08_ADDR_R);//器件地址+讀使能
data=IIC_readData();//讀取一個字節數據
IIC_Stop();//停止信號
return data;
}
6.5 主函數
//發送數據
void IIC_WriteData(uint8_t data)
{
hi2c1.Instance->DR=data;
while(!(hi2c1.Instance->SR1&1<<7)){}//等待數據發送完成
}
/*發送地址*/
void IIC_WriteAddr(uint8_t adrr)
{
uint8_t stat;
hi2c1.Instance->DR=adrr;
while(!(hi2c1.Instance->SR1&1<<1)){}//等待數據發送完成
stat=hi2c1.Instance->SR2;//對SR2讀取清除標志位
}
uint8_t IIC_readData(void)
{
uint8_t data;
hi2c1.Instance->CR1|=1<<10;//產生應答
while(!(hi2c1.Instance->SR1&1<<6)){}//等待數據到來
data=hi2c1.Instance->DR;
hi2c1.Instance->CR1&=~(1<<10);//取消應答發送
return data;
}
注意:STM32F10x硬件IIC和FSMC不能同時使用;
??在STM32勘誤手冊中有說明:
6.6 示例效果
-
驅動
+關注
關注
12文章
1838瀏覽量
85262 -
STM32
+關注
關注
2270文章
10895瀏覽量
355729 -
IIC
+關注
關注
11文章
300瀏覽量
38311 -
EEPORM
+關注
關注
0文章
2瀏覽量
2038
發布評論請先 登錄
相關推薦
評論