標頭檔案
myiic.h
#ifndef __myiic_h
#define __myiic_h
#include "sys.h"
//io方向設定
//crh,crl 埠輸入輸出模式暫存器。crh為8-15引腳,crl為0-7引腳
#define sda_in() //pc11引腳為上拉/下拉輸入
#define sda_out() //pc11為推挽輸出
//io操作函式
#define iic_scl pcout(12) //scl
#define iic_sda pcout(11) //sda
#define read_sda pcin(11) //輸入sda
//iic所有操作函式
void iic_init(void); //初始化iic的io口
void iic_start(void); //傳送iic開始訊號
void iic_stop(void); //傳送iic停止訊號
void iic_send_byte(u8 txd); //iic傳送乙個位元組
u8 iic_read_byte(unsigned char ack);//iic讀取乙個位元組
u8 iic_wait_ack(void); //iic等待ack訊號
void iic_ack(void); //iic傳送ack訊號
void iic_nack(void); //iic不傳送ack訊號
//一下兩個函式實際並未被定義
void iic_write_one_byte(u8 daddr,u8 addr,u8 data);
u8 iic_read_one_byte(u8 daddr,u8 addr);
#endif
.c檔案
#include "myiic.h"
#include "delay.h"
//初始化iic
//硬體i2c必須開漏輸出
//模擬i2c則為推挽輸出(方便輸出高低電平?)
void iic_init(void)
//產生iic起始訊號
//scl為高時,sda拉低,準備開始傳資料。(記得再拉低scl)
//scl為高時,sda拉高,結束傳輸資料。
//傳輸資料時,scl為高時資料有效
void iic_start(void)
//產生iic停止訊號
void iic_stop(void)
//等待應答訊號到來
//返回值:1,接收應答失敗
// 0,接收應答成功
u8 iic_wait_ack(void)
}iic_scl=0;//時鐘輸出0
return 0;
}//產生ack應答
void iic_ack(void)
//不產生ack應答
void iic_nack(void)
//iic傳送乙個位元組
//返回從機有無應答
//1,有應答
//0,無應答
void iic_send_byte(u8 txd)
}
//讀1個位元組,ack=1時,傳送ack,ack=0,傳送nack
u8 iic_read_byte(unsigned char ack)
if (!ack)
iic_nack();//傳送nack
else
iic_ack(); //傳送ack
return receive;
}
普通IO模擬i2c匯流排
一 i2c匯流排協議 二.普通io模擬i2c匯流排 三.簡單i2c裝置驅動例項 下面簡單的微控制器程式,理解之後會讓你對i2c匯流排有更深的認識,思路 1.向eeprom中通過i2c匯流排寫入乙個位元組 2.通過i2c匯流排讀出寫入的位元組 3.如果寫入和讀出成功點亮發光二極體 執行結果 d1亮,程...
I2C 協議之軟體模擬時序
i2c 匯流排時 philips 公司推出的一種序列匯流排,具備多主機系統所需的包括匯流排仲裁和高低速器件同步功能的高效能序列匯流排。它只需要兩跟雙向的訊號線,一根資料線 sda,乙個是時鐘線 scl。在 i2c 匯流排上面,每個器件都有自己相應的 i2c 位址,所以在兩個器件之間進行通訊的時候,都...
除錯模擬I2C遇到的問題
最近一直在調模擬i2c,使用的是rtt提供的模擬i2c的驅動,工作是從stm32f302移植到stm32f103,主要的改動在於定時器和gpio。除錯幾天之後發現總是沒有ack,一直懷疑是在讀ack的時候沒有把sda的gpio配置為輸入模式,但也沒有去深究 太不嚴謹了!定時器確定沒有問題之後,問題肯...