一、硬件連接
功能口 | 引腳 |
---|---|
SCL | PB.6 |
SDA | PB.5 |
鏈接:https://pan.baidu.com/s/1wxbQTMlnX2pavrbW2RYg4g 提取碼:dxex
將 board_i2c.c 和 board_i2c.h 兩個(gè)文件加入工程的User文件夾下
注意:延時(shí)函數(shù)使用了FreeRTOS的vTaskDelay任務(wù)延時(shí)函數(shù)
2.1 board_i2c.c
/*********************************************************************
* INCLUDES
*/
#include 'FreeRTOS.h'
#include 'task.h'
#include 'board_i2c.h'
#include 'board_systick.h'
static void SDA_OUT_MODE(void);
static void SDA_IN_MODE(void);
/*********************************************************************
* PUBLIC FUNCTIONS
*/
/**
@brief I2C驅(qū)動(dòng)初始化,采用模擬IO的方式實(shí)現(xiàn)
@param 無(wú)
@return 無(wú)
*/
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(IIC_SCL_CLK | IIC_SDA_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(IIC_SCL_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);
IIC_Stop(); // 給一個(gè)停止信號(hào), 復(fù)位I2C總線上的所有設(shè)備到待機(jī)模式
}
/**
@brief CPU發(fā)起I2C總線啟動(dòng)信號(hào)
@param 無(wú)
@return 無(wú)
*/
void IIC_Start(void)
{
SDA_OUT_MODE(); // SDA線輸出模式
IIC_SDA_1();
IIC_SCL_1();
vTaskDelay(1);
IIC_SDA_0(); // 當(dāng)SCL高電平時(shí),SDA出現(xiàn)一個(gè)下跳沿表示I2C總線啟動(dòng)信號(hào)
vTaskDelay(1);
IIC_SCL_0(); // 鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
}
/**
@brief CPU發(fā)起I2C總線停止信號(hào)
@param 無(wú)
@return 無(wú)
*/
void IIC_Stop(void)
{
SDA_OUT_MODE(); // SDA線輸出模式
IIC_SCL_0();
IIC_SDA_0();
IIC_SCL_1();
vTaskDelay(1);
IIC_SDA_1(); // 當(dāng)SCL高電平時(shí),SDA出現(xiàn)一個(gè)上跳沿表示I2C總線停止信號(hào)
vTaskDelay(1);
}
/**
@brief CPU向I2C總線設(shè)備發(fā)送8bit數(shù)據(jù)
@param ucByte -[in] 等待發(fā)送的字節(jié)
@return 無(wú)
*/
void IIC_SendByte(uint8_t ucByte)
{
uint8_t i;
SDA_OUT_MODE(); // SDA線輸出模式
IIC_SCL_0(); // 拉低時(shí)鐘開始數(shù)據(jù)傳輸
for(i = 0; i < 8; i++)
{
if(ucByte & 0x80)
{
IIC_SDA_1();
}
else
{
IIC_SDA_0();
}
ucByte <<= 1;
vTaskDelay(1);
IIC_SCL_1();
vTaskDelay(1);
IIC_SCL_0();
vTaskDelay(1);
}
}
/**
@brief CPU從I2C總線設(shè)備讀取8bit數(shù)據(jù)
@param 無(wú)
@return 讀到的數(shù)據(jù)
*/
uint8_t IIC_ReadByte(void)
{
uint8_t i = 0;
uint8_t value = 0;
SDA_IN_MODE(); // SDA線輸入模式
for(i = 0; i < 8; i++)
{
value <<= 1;
IIC_SCL_1();
vTaskDelay(1);
if(IIC_SDA_READ())
{
value++;
}
IIC_SCL_0();
vTaskDelay(1);
}
IIC_Ack();
return value;
}
/**
@brief CPU產(chǎn)生一個(gè)時(shí)鐘,并讀取器件的ACK應(yīng)答信號(hào)
@param 無(wú)
@return 返回0表示正確應(yīng)答,1表示無(wú)器件響應(yīng)
*/
uint8_t IIC_WaitAck(void)
{
uint8_t result = 0;
SDA_IN_MODE(); // SDA線輸入模式
IIC_SDA_1(); // CPU釋放SDA總線
vTaskDelay(1);
IIC_SCL_1(); // CPU驅(qū)動(dòng)SCL = 1, 此時(shí)器件會(huì)返回ACK應(yīng)答
vTaskDelay(1);
if(IIC_SDA_READ())
{
result = 1;
}
else
{
result = 0;
}
IIC_SCL_0();
vTaskDelay(1);
return result;
}
/**
@brief CPU產(chǎn)生一個(gè)ACK信號(hào)
@param 無(wú)
@return 無(wú)
*/
void IIC_Ack(void)
{
SDA_OUT_MODE(); // SDA線輸出模式
IIC_SDA_0(); // CPU驅(qū)動(dòng)SDA = 0
vTaskDelay(1);
IIC_SCL_1(); // CPU產(chǎn)生1個(gè)時(shí)鐘
vTaskDelay(1);
IIC_SCL_0();
vTaskDelay(1);
IIC_SDA_1(); // CPU釋放SDA總線
}
/**
@brief CPU產(chǎn)生1個(gè)NACK信號(hào)
@param 無(wú)
@return 無(wú)
*/
void IIC_NAck(void)
{
SDA_OUT_MODE(); // SDA線輸出模式
IIC_SDA_1(); // CPU驅(qū)動(dòng)SDA = 1
vTaskDelay(1);
IIC_SCL_1(); // CPU產(chǎn)生1個(gè)時(shí)鐘
vTaskDelay(1);
IIC_SCL_0();
vTaskDelay(1);
}
/**
@brief 檢測(cè)I2C總線設(shè)備,CPU向發(fā)送設(shè)備地址,然后讀取設(shè)備應(yīng)答來判斷該設(shè)備是否存在
@param address -[in] 設(shè)備的I2C總線地址+讀寫控制bit(0 = w, 1 = r)
@return 0 - 表示正確, 1 - 表示未探測(cè)到
*/
uint8_t IIC_CheckDevice(uint8_t address)
{
uint8_t ucAck;
IIC_Init(); // 初始化I2C
IIC_Start(); // 發(fā)送啟動(dòng)信號(hào)
IIC_SendByte(address); // 設(shè)備的I2C總線地址+讀寫控制bit(0 = w, 1 = r)
ucAck = IIC_WaitAck(); // 檢測(cè)設(shè)備的ACK應(yīng)答
IIC_Stop(); // 發(fā)送停止信號(hào)
return ucAck;
}
/*********************************************************************
* LOCAL FUNCTIONS
*/
/**
@brief SDA輸出配置
@param 無(wú)
@return 無(wú)
*/
static void SDA_OUT_MODE(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);
}
/**
@brief SDA輸入配置
@param 無(wú)
@return 無(wú)
*/
static void SDA_IN_MODE(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);
}
/****************************************************END OF FILE****************************************************/
2.2 board_i2c.h
#ifndef _BOARD_I2C_H_
#define _BOARD_I2C_H_
/*********************************************************************
* INCLUDES
*/
#include 'stm32f10x.h'
/*********************************************************************
* DEFINITIONS
*/
// I2C_SCL時(shí)鐘
#define IIC_SCL_CLK RCC_APB2Periph_GPIOB // GPIO端口時(shí)鐘
#define IIC_SCL_PORT GPIOB // GPIO端口
#define IIC_SCL_PIN GPIO_Pin_6 // GPIO引腳
// I2C_SDA時(shí)鐘
#define IIC_SDA_CLK RCC_APB2Periph_GPIOB // GPIO端口時(shí)鐘
#define IIC_SDA_PORT GPIOB // GPIO端口
#define IIC_SDA_PIN GPIO_Pin_5 // GPIO引腳
/*********************************************************************
* MACROS
*/
#define IIC_SCL_0() GPIO_ResetBits(IIC_SCL_PORT, IIC_SCL_PIN)
#define IIC_SCL_1() GPIO_SetBits(IIC_SCL_PORT, IIC_SCL_PIN)
#define IIC_SDA_0() GPIO_ResetBits(IIC_SDA_PORT, IIC_SDA_PIN)
#define IIC_SDA_1() GPIO_SetBits(IIC_SDA_PORT, IIC_SDA_PIN)
#define IIC_SDA_READ() GPIO_ReadInputDataBit(IIC_SDA_PORT, IIC_SDA_PIN)
/*********************************************************************
* API FUNCTIONS
*/
void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
void IIC_SendByte(uint8_t ucByte);
uint8_t IIC_ReadByte(void);
uint8_t IIC_WaitAck(void);
void IIC_Ack(void);
void IIC_NAck(void);
uint8_t IIC_CheckDevice(uint8_t address);
上一篇:STM32F103學(xué)習(xí)筆記(2)——收音機(jī)模塊TEA5767使用
下一篇:OSW-MMOS直驅(qū)方向盤DIY過程記錄2-PWM+DIR模式
推薦閱讀最新更新時(shí)間:2025-06-05 20:49




設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- 【RA】瑞薩mcu聲光控制器
- BD48K55電壓檢測(cè)IC在BD48xxx系列中的典型應(yīng)用
- OP213FSZ-REEL耳機(jī)輸出放大器多媒體聲音編解碼器典型應(yīng)用
- 【立創(chuàng)開發(fā)板】灰灰四驅(qū)智能小車
- 使用 ROHM Semiconductor 的 BU4918 的參考設(shè)計(jì)
- AH1308 應(yīng)用提示 - Mantis TJA1057 5V 高速 CAN 收發(fā)器
- LF25ABDT-TR 2.5V低壓燈泡典型應(yīng)用
- DC1418A-B,使用 LT6604-5、5MHz 雙通道、匹配、全差分低通濾波器的演示板
- LT3091MPT7 500mA LED 驅(qū)動(dòng)器的典型應(yīng)用,具有接地 LED 接線片(散熱器)
- LTC1855、8 通道、10V 輸入、14 位、100ksps ADC 轉(zhuǎn)換器的典型應(yīng)用,具有停機(jī)功能
- 51單片機(jī)-進(jìn)一步理解中斷函數(shù)
- 步進(jìn)電機(jī)選型的步驟及步進(jìn)電機(jī)選型方法
- 小米推智能眼鏡探索版,支持通話、拍照、導(dǎo)航
- 一加10 Pro手機(jī)在京東等開啟預(yù)約
- 基于ATMEGA8A單片機(jī)+MAX6675的K型熱電偶程序Proteus測(cè)試
- ASPEED選擇CEVA的DSP用于其視頻會(huì)議SoC中的音頻和語(yǔ)音處理
- 征程5賦能,東軟睿馳高性能行泊一體域控制器量產(chǎn)落地
- 食堂蔬菜農(nóng)藥殘留檢測(cè)儀用處
- 能出汗會(huì)呼吸的戶外行走機(jī)器人面世,有助研究人類對(duì)強(qiáng)熱浪的反應(yīng)
- PCIe M.2接口測(cè)試的現(xiàn)狀、挑戰(zhàn)與泰克解決方案
- ABB在中國(guó)推出面向電子制造業(yè)的兩大全新機(jī)器人系列
- ABB在中國(guó)推出PoWa協(xié)作機(jī)器人系列
- 西門子 NX 新增 AI 助手等多項(xiàng)功能
- 貿(mào)澤即日起開售適用于數(shù)據(jù)中心和網(wǎng)絡(luò)應(yīng)用的 全新TE Connectivity QSFP 112G SMT連接器
- ABB推出三大全新機(jī)器人系列,強(qiáng)化中國(guó)機(jī)器人市場(chǎng)領(lǐng)導(dǎo)地位
- 新思科技關(guān)于美國(guó)解除近期對(duì)華出口限制的聲明
- Wolfspeed 1700 V MOSFET 技術(shù),助力重塑輔助電源系統(tǒng)的耐用性和成本
- 英飛凌大中華區(qū) 2025 生態(tài)創(chuàng)新峰會(huì),究竟探討了哪些創(chuàng)新與生態(tài)合作?
- Microchip攜手Nippon Chemi-Con和NetVision 打造日本汽車市場(chǎng)首個(gè)ASA-ML攝像頭開發(fā)生態(tài)系統(tǒng)
- 進(jìn)出地庫(kù)無(wú)需司機(jī)!百度自動(dòng)泊車方案宣布年內(nèi)量產(chǎn)落地:方便到家
- ABB在京設(shè)立首個(gè)智慧建筑客戶體驗(yàn)中心,慶祝低壓北京工廠25周年
- 松湖煙雨話創(chuàng)新,灣區(qū)機(jī)器人與新工科教育迎發(fā)展新機(jī)遇
- 技術(shù)文章—5G SA和NSA到底有啥區(qū)別?
- DeepNude現(xiàn)在火了,看看一鍵脫衣AI原理的秘密
- 6月4號(hào)!蘋果WWDC 2018大會(huì)時(shí)間確認(rèn)
- 新旗艦一加6跑分曝光 目前安兔兔得分最高手機(jī)
- 索尼新旗艦Xperia XZ2落地中國(guó) 你會(huì)為信仰充值嗎?
- 索尼Xperia XZ2評(píng)測(cè):口碑與信仰你會(huì)選擇哪一個(gè)?
- 搜狗翻譯寶簡(jiǎn)評(píng):中英翻譯合格 尚需更多離線語(yǔ)種
- EEWORLD大學(xué)堂----電動(dòng)汽車模擬引擎聲音系統(tǒng)設(shè)計(jì)
- ULN2803可以驅(qū)動(dòng)直流電機(jī)嗎?
- 分享個(gè)好東西:電阻顏色代碼計(jì)算器
- QQ群-->嵌入式開發(fā)討論組:79934933
- PCB中如何把兩個(gè)不同的插件的焊盤之間做成跳線?
- EEWORLD大學(xué)堂----東芝 Bluetooth IC
- 【EEWORLD帶你DIY】單片機(jī)零起點(diǎn)入門,帶你DIY 51開發(fā)板
- 嵌入式微處理器的選擇
- AT89S51看門狗程序例子
- 【TI首屆低功耗設(shè)計(jì)大賽】微型LCR測(cè)試儀-電阻測(cè)試與精度對(duì)比