處理器和晶元間的通訊可以形象的比喻成兩個人講話:1、你說的別人得能聽懂:雙方約定訊號的協議。2、你的語速別人得能接受:雙方滿足時序要求。
一、iic匯流排的訊號型別
1、開始訊號:處理器讓scl時鐘保持高電平,然後讓sda資料訊號由高變低就表示乙個開始訊號。同時iic匯流排上的裝置檢測到這個開始訊號它就知道處理器要傳送資料了。
2、停止訊號:處理器讓scl時鐘保持高電平,然後讓sda資料訊號由低變高就表示乙個停止訊號。同時iic匯流排上的裝置檢測到這個停止訊號它就知道處理器已經結束了資料傳輸,我們就可以各忙各個的了,如休眠等。
二、iic資料傳輸過程
1、在資料傳輸時,sda的資料在scl為高電平時,必須保持穩定,scl高電平器件完成資料的傳輸。在scl低電平器件,可以任意改變sda的資料。資料寫入過程是從最好為開始,高位在前,低位在後,即msb。
2、響應訊號(ack):接收器在接收到8位資料後,在第9個時鐘週期,拉低sda電平。即接收資料的ic在接收到8bit資料後,向傳送資料的ic發出特定的低電平脈衝,表示已收到資料。cpu向受控單元發出乙個訊號後,等待受控單元發出乙個應答訊號,cpu接收到應答訊號後,根據實際情況作出是否繼續傳遞訊號的判斷。若未收到應答訊號,由判斷為受控單元出現故障。
三、資料寫入的過程
首先傳送乙個開始訊號,接著傳送從機位址,oled的從機位址前7位為位址,最後一位表示讀(1)或者寫(0)。應答ack訊號表示有這個從裝置存在。在接收到應答訊號後,傳送控制位,來區分之後所傳送的資料是控制命令還是顯示相關的資料。在傳送控制位後,等待應答訊號。然後傳送相應的控制命令或者資料。最後傳送停止訊號,表示資料傳輸完成。
基本的時序就是以上內容,接下來是原始碼:
#include "stm32f10x.h"
#include "iic.h"
#include "delay.h"
#include "codetab.h"
/**** 初始化iic介面
**/void iic_init(void)
/**** 設定sda為輸出
**/void sda_out(void)
/**** 設定sda為輸入
**/void sda_in(void)
//開始訊號
void iic_start(void)
void iic_stop(void)
/** 返回1--應答出錯
* 放回0--應答正確
*/u8 iic_wait_ask(void)
}iic_scl=0;
delay_us(2);
return0;}
//寫乙個位元組
void iic_writebyte(u8 data)
}u8 iic_readbyte(void)
iic_scl=0;
delay_us(2);
return data;
}void writecmd(u8 command)
void writedat(u8 data)
void oled_init(void)
/***@brief oled_on,將oled從休眠中喚醒
*@param 無
*@retval 無
*/void oled_on(void)
/***@brief oled_setpos,設定游標
*@param x,游標x位置
* y,游標y位置
*@retval 無
*/void oled_setpos(unsigned char x, unsigned char y) //設定起始點座標
/***@brief oled_fill,填充整個螢幕
*@param fill_data:要填充的資料
*@retval 無
*/void oled_fill(unsigned char fill_data)//全屏填充
}}void oled_cls(void)//清屏
/** *@brief oled_showstr,顯示codetab.h中的ascii字元,有6*8和8*16可選擇
*@param x,y : 起始點座標(x:0~127, y:0~7);
* ch :- 要顯示的字串;
* textsize : 字元大小(1:6*8 ; 2:8*16)
*@retval 無
*/void oled_showstr(unsigned char x, unsigned char y, unsigned char ch, unsigned char textsize)
oled_setpos(x,y);
for(i=0;i<6;i++)
writedat(f6x8[c][i]);
x += 6;
j++;
}}break;
case
2:
oled_setpos(x,y);
for(i=0;i<8;i++)
writedat(f8x16[c*16+i]);
oled_setpos(x,y+1);
for(i=0;i<8;i++)
writedat(f8x16[c*16+i+8]);
x += 8;
j++;
}}break;}}
stm32軟體模擬iic
iic inter integrated circuit 匯流排是一種由philips公司在80年代開發的兩線式序列匯流排,用於連線微控制器及其外圍裝置。它是半雙工通訊方式。iic匯流排最主要的優點是其簡單性和有效性。由於介面直接在元件之上,因此iic匯流排占用的空間非常小,減少了電路板的空間和晶元...
STM32模擬IIC讀寫EEPROM
本人在最近的專案中,需要讀寫eeprom裡面的內容並分析。該eeprom晶元為microchip technology公司的24lc02b系列。用stm32f103晶元做主機通過iic介面去和它通訊。首先介紹晶元的基本特性,容量為 256 x 8bit 2kbit共有256位元組 位址和資料都是8b...
stm32模擬iic暫存器配置
io方向設定 define mpu sda in define mpu sda out io操作函式 define mpu iic scl pbout 10 scl define mpu iic sda pbout 11 sda define mpu read sda pbin 11 輸入sda 每...