bsp_i2c_gpio.h
#ifndef _BSP_I2C_GPIO_H
#define _BSP_I2C_GPIO_H
#include "stm32f4xx.h"
#include #define EEPROM_I2C_WR 0 /* 寫控制bit */ #define EEPROM_I2C_RD 1 /* 讀控制bit */ /* 定義I2C總線連接的GPIO端口,用戶只需要修改下面四行代碼即可任意改變SCL和SDA的引腳 */ #define EEPROM_I2C_GPIO_PORT GPIOB #define EEPROM_I2C_GPIO_CLK RCC_AHB1Periph_GPIOB #define EEPROM_I2C_SCL_PIN GPIO_Pin_6 /* 連接到SCL時鐘線的GPIO */ #define EEPROM_I2C_SDA_PIN GPIO_Pin_7 /* 連接到SDA數(shù)據(jù)線的GPIO */ /* 定義讀寫SCL和SDA的宏,增加代碼可讀性和可移植性 */ #if 1 /* 條件編譯:1 選擇GPIO庫函數(shù)實現(xiàn)IO讀寫 */ #define EEPROM_I2C_SCL_1() GPIO_SetBits(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SCL_PIN) /* SCL = 1 */ #define EEPROM_I2C_SCL_0() GPIO_ResetBits(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SCL_PIN) /* SCL = 0 */ #define EEPROM_I2C_SDA_1() GPIO_SetBits(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SDA_PIN) /* SDA = 1 */ #define EEPROM_I2C_SDA_0() GPIO_ResetBits(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SDA_PIN) /* SDA = 0 */ #define EEPROM_I2C_SDA_READ() GPIO_ReadInputDataBit(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SDA_PIN) /* 讀SDA口線狀態(tài) */ #else /* 這個分支選擇直接寄存器操作實現(xiàn)IO讀寫 */ /*注意: 如下寫法,在IAR最高級別優(yōu)化時會被編譯器錯誤優(yōu)化 */ #define EEPROM_I2C_SCL_1() EEPROM_I2C_GPIO_PORT->BSRRL = EEPROM_I2C_SCL_PIN /* SCL = 1 */ #define EEPROM_I2C_SCL_0() EEPROM_I2C_GPIO_PORT->BSRRH = EEPROM_I2C_SCL_PIN /* SCL = 0 */ #define EEPROM_I2C_SDA_1() EEPROM_I2C_GPIO_PORT->BSRRL = EEPROM_I2C_SDA_PIN /* SDA = 1 */ #define EEPROM_I2C_SDA_0() EEPROM_I2C_GPIO_PORT->BSRRH = EEPROM_I2C_SDA_PIN /* SDA = 0 */ #define EEPROM_I2C_SDA_READ() ((EEPROM_I2C_GPIO_PORT->IDR & EEPROM_I2C_SDA_PIN) != 0) /* 讀SDA口線狀態(tài) */ #endif void i2c_Start(void); void i2c_Stop(void); void i2c_SendByte(uint8_t _ucByte); uint8_t i2c_ReadByte(void); uint8_t i2c_WaitAck(void); void i2c_Ack(void); void i2c_NAck(void); uint8_t i2c_CheckDevice(uint8_t _Address); #endif bsp_i2c_gpio.c /* 應(yīng)用說明: 在訪問I2C設(shè)備前,需要先調(diào)用i2c_CheckDevice()檢測I2C設(shè)備是否正常,該函數(shù)會配置GPIO */ #include "./i2c/bsp_i2c_gpio.h" static void i2c_CfgGpio(void); /* ********************************************************************************************************* * I2C總線位延遲,最快400KHz ********************************************************************************************************* */ static void i2c_Delay(void) { uint8_t i; for (i = 0; i < 30; i++); } /* ********************************************************************************************************* * CPU發(fā)起I2C總線啟動信號 ********************************************************************************************************* */ void i2c_Start(void) { /* 當(dāng)SCL高電平時,SDA出現(xiàn)一個下跳沿表示I2C啟動信號 */ EEPROM_I2C_SDA_1(); EEPROM_I2C_SCL_1(); i2c_Delay(); EEPROM_I2C_SDA_0(); i2c_Delay(); EEPROM_I2C_SCL_0(); i2c_Delay(); } /* ********************************************************************************************************* * CPU發(fā)起I2C總線停止信號 ********************************************************************************************************* */ void i2c_Stop(void) { /* 當(dāng)SCL高電平時,SDA出現(xiàn)一個下跳沿表示I2C停止信號 */ EEPROM_I2C_SDA_0(); EEPROM_I2C_SCL_1(); i2c_Delay(); EEPROM_I2C_SDA_1(); } /* ********************************************************************************************************* * CPU向I2C總線設(shè)備發(fā)送8bit數(shù)據(jù) * _ucByte:等待發(fā)送的字節(jié) ********************************************************************************************************* */ void i2c_SendByte(uint8_t _ucByte) { uint8_t i; /* ?è·¢?í×??úμ?????bit7 */ for (i = 0; i < 8; i++) { if (_ucByte & 0x80) { EEPROM_I2C_SDA_1(); } else { EEPROM_I2C_SDA_0(); } i2c_Delay(); EEPROM_I2C_SCL_1(); i2c_Delay(); EEPROM_I2C_SCL_0(); if (i == 7) { EEPROM_I2C_SDA_1(); // 釋放總線 } _ucByte <<= 1; /* 左移一個bit */ i2c_Delay(); } } /* ********************************************************************************************************* * CPU向I2C總線設(shè)備讀寫8bit數(shù)據(jù) * 返回值為讀到的數(shù)據(jù) ********************************************************************************************************* */ uint8_t i2c_ReadByte(void) { uint8_t i; uint8_t value; value = 0; for (i = 0; i < 8; i++) { value <<= 1; EEPROM_I2C_SCL_1(); i2c_Delay(); if (EEPROM_I2C_SDA_READ()) { value++; } EEPROM_I2C_SCL_0(); i2c_Delay(); } return value; } /* ********************************************************************************************************* * CPU產(chǎn)生一個時鐘,并讀取器件的ACK應(yīng)答信號 * 返回0表示正確應(yīng)答,返回1表示無器件響應(yīng) ********************************************************************************************************* */ uint8_t i2c_WaitAck(void) { uint8_t re; EEPROM_I2C_SDA_1(); /* CPU釋放SDA總線 */ i2c_Delay(); EEPROM_I2C_SCL_1(); /* CPU驅(qū)動SCL = 1,此時器件會返回ACK應(yīng)答 */ i2c_Delay(); if (EEPROM_I2C_SDA_READ()) /* CPU訪問SDA口線狀態(tài) */ { re = 1; } else { re = 0; } EEPROM_I2C_SCL_0(); i2c_Delay(); return re; } /* ********************************************************************************************************* * CPU產(chǎn)生一個ACK信號 ********************************************************************************************************* */ void i2c_Ack(void) { EEPROM_I2C_SDA_0(); /* CPU驅(qū)動SDA = 0 */ i2c_Delay(); EEPROM_I2C_SCL_1(); /* CPU產(chǎn)生1個時鐘 */ i2c_Delay(); EEPROM_I2C_SCL_0(); i2c_Delay(); EEPROM_I2C_SDA_1(); /* CPU釋放SDA總線 */ } /* ********************************************************************************************************* * CPU產(chǎn)生一個NACK信號 ********************************************************************************************************* */ void i2c_NAck(void) { EEPROM_I2C_SDA_1(); /* CPU驅(qū)動SDA = 1 */ i2c_Delay(); EEPROM_I2C_SCL_1(); /* CPU產(chǎn)生1個時鐘 */ i2c_Delay(); EEPROM_I2C_SCL_0(); i2c_Delay(); } /* ********************************************************************************************************* * 配置I2C總線的GPIO,采用模擬IO的方式實現(xiàn) ********************************************************************************************************* */ static void i2c_CfgGpio(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(EEPROM_I2C_GPIO_CLK, ENABLE); /* 打開GPIO時鐘 */ GPIO_InitStructure.GPIO_Pin = EEPROM_I2C_SCL_PIN | EEPROM_I2C_SDA_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; /* 開漏輸出 */ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(EEPROM_I2C_GPIO_PORT, &GPIO_InitStructure); /* 給一個停止信號,復(fù)位I2C總線上的所有設(shè)備到待機模式 */ i2c_Stop(); } /* ********************************************************************************************************* * 檢測I2C總線設(shè)備,CUP發(fā)送設(shè)備地址,讀取設(shè)備應(yīng)答判斷設(shè)備是否存在 * 返回0表示設(shè)備存在,返回1表示未探測到 ********************************************************************************************************* */ uint8_t i2c_CheckDevice(uint8_t _Address) { uint8_t ucAck; i2c_CfgGpio(); /* 配置GPIO */ i2c_Start(); /* 發(fā)送啟動信號 */ /* 發(fā)送設(shè)備地址+讀寫控制bit(0=w,1=r)bit7先傳 */ i2c_SendByte(_Address | EEPROM_I2C_WR); ucAck = i2c_WaitAck(); /* 檢測設(shè)備的ACK應(yīng)答 */ i2c_Stop(); /* 發(fā)送停止信號 */ return ucAck; }
上一篇:嵌入式STM32學(xué)習(xí):I2C-讀寫EEPROM2
下一篇:嵌入式stm32學(xué)習(xí):DMA-存儲到外設(shè)
推薦閱讀
史海拾趣
由于AXSEM公司在電子行業(yè)的具體發(fā)展故事細節(jié)可能涉及到公司內(nèi)部資料,并且不易公開獲取,因此難以提供五個具體的故事。不過,可以依據(jù)公開信息,嘗試概述AXSEM公司的發(fā)展概況和可能的發(fā)展故事線索。
故事一:創(chuàng)立與早期發(fā)展
AXSEM公司成立于2000年,自創(chuàng)立之初,就專注于無線射頻技術(shù)的研發(fā)與創(chuàng)新。在創(chuàng)始人及團隊的共同努力下,公司成功開發(fā)了多個高容量通信射頻集成電路,如SigFox、EnOcean等,這些技術(shù)在當(dāng)時的物聯(lián)網(wǎng)和無線通信領(lǐng)域具有前瞻性。公司憑借其技術(shù)優(yōu)勢,逐步在市場中樹立了良好的口碑,為后續(xù)的發(fā)展奠定了堅實的基礎(chǔ)。
故事二:技術(shù)突破與市場拓展
隨著無線通信技術(shù)的快速發(fā)展,AXSEM公司不斷突破技術(shù)瓶頸,推出了一系列具有創(chuàng)新性的產(chǎn)品。這些產(chǎn)品不僅支持物聯(lián)網(wǎng)、自動抄表、家庭自動化等領(lǐng)域的應(yīng)用,還廣泛應(yīng)用于傳感器網(wǎng)絡(luò)和衛(wèi)星通信市場。公司憑借這些產(chǎn)品,成功拓展了市場份額,實現(xiàn)了業(yè)務(wù)的快速增長。
故事三:戰(zhàn)略合作與資源整合
為了進一步提升技術(shù)實力和市場競爭力,AXSEM公司積極尋求與其他企業(yè)的戰(zhàn)略合作。通過與其他知名企業(yè)的合作,公司成功整合了資源,優(yōu)化了產(chǎn)品線,提高了生產(chǎn)效率。同時,這些合作也為公司帶來了更多的市場機會,推動了公司的持續(xù)發(fā)展。
故事四:國際化發(fā)展與品牌提升
隨著業(yè)務(wù)的不斷拓展,AXSEM公司開始將目光投向國際市場。公司積極參與國際展覽和交流活動,與全球客戶建立了廣泛的聯(lián)系。通過不斷提升產(chǎn)品質(zhì)量和服務(wù)水平,公司的品牌知名度和美譽度逐漸提升,為全球客戶提供了更加優(yōu)質(zhì)的產(chǎn)品和服務(wù)。
故事五:未來展望與創(chuàng)新驅(qū)動
面對未來電子行業(yè)的快速發(fā)展和變革,AXSEM公司將繼續(xù)堅持創(chuàng)新驅(qū)動的發(fā)展戰(zhàn)略。公司將加大研發(fā)投入,不斷推出具有創(chuàng)新性和競爭力的新產(chǎn)品。同時,公司還將積極拓展新的應(yīng)用領(lǐng)域和市場,為全球客戶提供更加全面和高效的解決方案。
請注意,以上僅為基于公開信息的AXSEM公司發(fā)展故事的概述,并未涉及具體的事實細節(jié)。如需了解更多關(guān)于AXSEM公司的故事,建議查閱公司官方網(wǎng)站、行業(yè)報告或相關(guān)新聞報道。
上海晶豐明源半導(dǎo)體股份有限公司的創(chuàng)立,標(biāo)志著中國在半導(dǎo)體領(lǐng)域的又一重要布局。公司自成立之初,就專注于電源管理芯片的研發(fā)與銷售,憑借對技術(shù)的深入理解和市場需求的敏銳洞察,迅速在行業(yè)中嶄露頭角。初步發(fā)展階段,晶豐明源通過不斷優(yōu)化產(chǎn)品設(shè)計、提升生產(chǎn)工藝,逐步贏得了客戶的信任,并在市場上占據(jù)了一席之地。
近年來,晶豐明源在電源管理芯片領(lǐng)域取得了多項技術(shù)突破。公司成功研發(fā)出多款高性能、低功耗的芯片產(chǎn)品,廣泛應(yīng)用于智能手機、平板電腦、智能家居等領(lǐng)域。同時,公司還積極拓展海外市場,與多家國際知名廠商建立了合作關(guān)系,產(chǎn)品出口至全球多個國家和地區(qū)。這些技術(shù)突破和市場拓展的成果,進一步鞏固了晶豐明源在行業(yè)內(nèi)的領(lǐng)先地位。
ALSC深知品質(zhì)是企業(yè)的生命線。因此,公司建立了嚴(yán)格的質(zhì)量管理體系,從原材料采購到產(chǎn)品出廠的每一個環(huán)節(jié)都進行嚴(yán)格把控。同時,公司還注重品牌建設(shè),通過廣告宣傳、參加展會等方式提升品牌知名度和美譽度。這些舉措使得ALSC在客戶心中樹立了良好的品牌形象。
為了保持競爭優(yōu)勢,ALSC始終將技術(shù)創(chuàng)新作為核心驅(qū)動力。公司投入大量資源用于研發(fā),不斷推出具有創(chuàng)新性的半導(dǎo)體產(chǎn)品。其中,一款具有高性能和低延遲的芯片產(chǎn)品贏得了市場的廣泛認可,為公司的快速發(fā)展奠定了堅實的基礎(chǔ)。
常州能動(ENDRIVE)公司自創(chuàng)立之初,就將技術(shù)創(chuàng)新作為公司發(fā)展的核心驅(qū)動力。在公司發(fā)展的早期階段,研發(fā)團隊成功開發(fā)出一款高效能、低能耗的電源管理芯片,這一創(chuàng)新產(chǎn)品在市場上引起了廣泛關(guān)注。通過不斷的技術(shù)迭代和優(yōu)化,這款芯片的性能逐漸提升,成本逐漸降低,成為了公司的明星產(chǎn)品,為公司的快速發(fā)展奠定了堅實基礎(chǔ)。
說明一下,我學(xué)習(xí)verilogFPGAD的時間不是很長,曾經(jīng)試著寫過像數(shù)字頻率計,數(shù)字時鐘之類的程序,并且在FPGA上面運行成功。有人告訴我用fpga干那些單片機可以實現(xiàn)的東西沒有必要,而且沒有意義,比如說顯示(數(shù)碼管,lcd,。vga不知道算不算),按鍵 ...… 查看全部問答∨ |
|
【申請加精】ARM 2009 Technical Symposium照片 圖大殺貓。。。 首先先說一句:我這里有當(dāng)時的全部PPT資料,如果有人想要,可以站內(nèi)聯(lián)系我,或者郵箱jikai#eeworld.com.cn 廢話不說,還是給大家上圖。 門口展覽的兩家公司大牌子,包括Dell的Z600上網(wǎng)本,其中用到了Montavista操作系統(tǒng)、TI的OMAP處理器以及采 ...… 查看全部問答∨ |
|
WinCE 6.0 在調(diào)試DLL中的函數(shù)時傳入的char*類型的參數(shù),看到的值是空的,但函數(shù)的執(zhí)行結(jié)果卻是正確的 dll 頭文件 Function.h class _declspec(dllexport)CFunction : public CObject { public: CFunction(); virtual ~CFunction(); int Add(i ...… 查看全部問答∨ |
MDK&STM32系列ARMCortex-M3視頻培訓(xùn)教程 為了滿足部分初學(xué)者的需求,我們制作了一份STM32培訓(xùn)視頻,供大家下載。結(jié)合兩本書,還有低成本的工具,我想對于初學(xué)者來說應(yīng)該會一定的幫助。目前提供的資料:《STM32系列ARM Cortex-M3微制器原理與應(yīng)用》《ARM開發(fā)工具RealView MD ...… 查看全部問答∨ |
最近想做點東西,由于模塊有點多,所以想用總線通信。但在IIC和CAN總線的選取上,由于自身對兩種總線了解不夠深,在此希望各位高手能指點一下。634796840是我QQ,可以留言也可以QQ聯(lián)系,謝謝啦!… 查看全部問答∨ |
|
本帖最后由 paulhyde 于 2014-9-15 03:06 編輯 2013年全國大學(xué)生電子設(shè)計競賽 全國一等獎候選隊及抽測的復(fù)評測試隊員名單(C題) … 查看全部問答∨ |
關(guān)于IAR variable "Fx" was set but never 我用的是iar for msp430v5.5.02這個版本#include #include \"Config.h\" void main(void) { int Fx,F; int k3=18,k2=-40,k ...… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 480Wh/kg!湖南久森半固態(tài)金屬鋰負極電池即將量產(chǎn)
- 中國首條硫化物固體電解質(zhì)量產(chǎn)線正式落地
- QUT開發(fā)出新的LENS系統(tǒng) 可以讓機器人進行類似大腦的導(dǎo)航
- 毫米波雷達裝機量分析:毫米波雷達裝車量持續(xù)攀升,大陸和博世占據(jù)60%以上市場份額
- TDK推出適用于車載濾波器的同軸電纜供電電感器
- 大摩給“人形機器人100”清單注入新思路
- 行家預(yù)判:2025年車載Mini LED反超OLED
- 2025數(shù)智未來峰會:深度解讀AI賦能工業(yè)的趨勢與實踐
- 工業(yè)自動化中的Raspberry Pi:簡化經(jīng)濟實惠的邊緣計算
- 意法半導(dǎo)體宣布擴大在新加坡的“Lab-in-Fab”廠內(nèi)實驗室合作項目
- 半導(dǎo)體品牌知名度問卷調(diào)查
- 上演你的“ADI實驗室電路”DIY!
- 下載有禮|是德科技電子書 《通過了解測試精度的基礎(chǔ)知識, 提高良率并降低風(fēng)險》,不做“差不多先生”
- 下載《Altera SoC深度體驗》,打分評論贏好禮
- 【已結(jié)束】 Qorvo、村田、NI直播【UWB最新技術(shù)、方案、市場、應(yīng)用解析】(13:30開始入場)
- TI 最新CapTIvate™ 觸控微控制器技術(shù)直播開始報名嘍!報名參與有禮呦!
- 老T叔的藏書閣——一位老工程師多年的資料積累
- 有獎直播【Keysight World Tech Day 2023分論壇——汽車自動駕駛與新能源】
- #最能打國產(chǎn)芯#能打入汽車電子這片地的國產(chǎn)芯,有多少啦?
- 新年新挑戰(zhàn):ST藍牙開發(fā)板免費申請評測+挑戰(zhàn)賽(littleshrimp帶隊)
- iPhone還能醫(yī)學(xué)研究?斯坦福的教授們是怎么說的
- 外媒:印度和塔塔拯救小米 讓其躋身阿里后最大IPO
- 索尼官方回應(yīng)XZ1/XZ2屏幕問題:靜電導(dǎo)致
- moto新機諜照曝光 指紋識別與logo二合一
- 寒武紀(jì)CEO陳天石:將考慮在境內(nèi)A股上市
- 加快自動駕駛發(fā)展: Arm與領(lǐng)軍企業(yè)成立自駕汽車計算協(xié)會
- 全新Mbed操作系統(tǒng)伙伴管理模型助力物聯(lián)網(wǎng)快速發(fā)展
- 隨日韓爭端升級,國產(chǎn)氟化氫企業(yè)迎來歷史發(fā)展機遇
- 蘋果與JDI敲定一筆至少500億日重要資金交易
- 意法半導(dǎo)體正在工業(yè)市場構(gòu)筑廣泛的生態(tài)系統(tǒng)