管腳配置(我是用的是PA9和PA10):
//i2c.h
#include "stm32f0xx_hal.h"
#define GPIO_PORT_I2C GPIOA // GPIO端口
#define I2C_SCL_PIN SCL_Pin // 連接到SCL時鐘線的GPIO
#define I2C_SDA_PIN SDA_Pin // 連接到SDA數據線的GPIO
/* 定義讀寫SCL和SDA的宏 */
#define I2C_SCL_1() GPIO_PORT_I2C->BSRR = I2C_SCL_PIN // SCL = 1
#define I2C_SCL_0() GPIO_PORT_I2C->BSRR = (uint32_t)I2C_SCL_PIN << 16U // SCL = 0
#define I2C_SDA_1() GPIO_PORT_I2C->BSRR = I2C_SDA_PIN // SDA = 1
#define I2C_SDA_0() GPIO_PORT_I2C->BSRR = (uint32_t)I2C_SDA_PIN << 16U // SDA = 0
#define I2C_SDA_READ() (GPIO_PORT_I2C->IDR & I2C_SDA_PIN) // 讀SDA口線狀態(tài)
#define I2C_SCL_READ() (GPIO_PORT_I2C->IDR & I2C_SCL_PIN) // 讀SCL口線狀態(tài)
void i2c_Start(void);
//停止信號
void i2c_Stop(void);
//發(fā)送一個字節(jié)
void i2c_SendByte(uint8_t _ucByte);
//讀取一個字節(jié)
uint8_t i2c_ReadByte(void);
//等待應答信號
uint8_t i2c_WaitAck(void);
//應答信號
void i2c_Ack(void);
//檢查設備
uint8_t i2c_CheckDevice(uint8_t _Address);
//發(fā)送數據
void Device_WriteData(uint8_t DeciveAddr,uint8_t *Data,int size);
//i2c.c
#include "i2c.h"
#include "main.h"
static void i2c_Delay(void)
{
uint8_t i;
for (i = 0; i < 40; i++);
}
//開始信號
void i2c_Start(void)
{
// 當SCL高電平時,SDA出現一個下跳沿表示I2C總線啟動信號
I2C_SDA_1();
I2C_SCL_1();
i2c_Delay();
I2C_SDA_0();
i2c_Delay();
I2C_SCL_0();
i2c_Delay();
}
//停止信號
void i2c_Stop(void)
{
// 當SCL高電平時,SDA出現一個上跳沿表示I2C總線停止信號
I2C_SDA_0();
I2C_SCL_1();
i2c_Delay();
I2C_SDA_1();
i2c_Delay();
}
//發(fā)送一個字節(jié)
void i2c_SendByte(uint8_t _ucByte)
{
uint8_t i;
// 先發(fā)送字節(jié)的高位bit7
for (i = 0; i < 8; i++)
{
if (_ucByte & 0x80)
{
I2C_SDA_1();
}
else
{
I2C_SDA_0();
}
i2c_Delay();
I2C_SCL_1();
i2c_Delay();
I2C_SCL_0();
if (i == 7)
{
I2C_SDA_1(); // 釋放總線
}
_ucByte <<= 1; // 左移一個bit
i2c_Delay();
}
}
//讀取一個字節(jié)
uint8_t i2c_ReadByte(void)
{
uint8_t i;
uint8_t value;
/* 讀到第1個bit為數據的bit7 */
value = 0;
for (i = 0; i < 8; i++)
{
value <<= 1;
I2C_SCL_1();
i2c_Delay();
if (I2C_SDA_READ())
{
value++;
}
I2C_SCL_0();
i2c_Delay();
}
return value;
}
//等待應答信號
uint8_t i2c_WaitAck(void)
{
uint8_t re;
I2C_SDA_1(); /* CPU釋放SDA總線 */
// i2c_Delay();
I2C_SCL_1(); /* CPU驅動SCL = 1, 此時器件會返回ACK應答 */
i2c_Delay();
if (I2C_SDA_READ()) /* CPU讀取SDA口線狀態(tài) */
{
re = 1;
}
else
{
re = 0;
}
I2C_SCL_0();
i2c_Delay();
return re;
}
//應答信號
void i2c_Ack(void)
{
I2C_SDA_0(); /* CPU驅動SDA = 0 */
i2c_Delay();
I2C_SCL_1(); /* CPU產生1個時鐘 */
i2c_Delay();
I2C_SCL_0();
i2c_Delay();
I2C_SDA_1(); /* CPU釋放SDA總線 */
}
uint8_t i2c_CheckDevice(uint8_t _Address)
{
uint8_t ucAck;
if (I2C_SDA_READ() && I2C_SCL_READ())
{
i2c_Start(); /* 發(fā)送啟動信號 */
/* 發(fā)送設備地址+讀寫控制bit(0 = w, 1 = r) bit7 先傳 */
i2c_SendByte(_Address | 0);
ucAck = i2c_WaitAck(); /* 檢測設備的ACK應答 */
i2c_Stop(); /* 發(fā)送停止信號 */
return ucAck;
}
return 1; /* I2C總線異常 */
}
void Device_WriteData(uint8_t DeciveAddr,uint8_t *Data,int size)
{
int count=size;
uint8_t *pData=Data;
//起始信號
i2c_Start();
//發(fā)送器件地址
i2c_SendByte(DeciveAddr);
//等待應答
i2c_WaitAck();
while(count--)
{
//發(fā)送數據
i2c_SendByte(*pData++);
//等待應答
i2c_WaitAck();
}
//結束信號
i2c_Stop();
}
上一篇:STM32F103,HAL實現軟件I2C,與硬件I2C
下一篇:STM32--HAL庫IIC
推薦閱讀
史海拾趣
1966年,Baumer Electric Ag完成了從個體企業(yè)向股份公司的轉型。同年,公司推出了測量開關和控制開關,這一創(chuàng)新產品為公司的成功發(fā)展奠定了堅實基礎。股份制改革為公司帶來了更多的資金和資源支持,加速了產品研發(fā)和市場推廣的進程。
隨著公司業(yè)務的不斷擴張和盈利能力的提升,Crystal Clear Technology逐漸吸引了資本市場的關注。公司通過發(fā)行股票和債券等方式籌集資金,為公司的研發(fā)、生產和市場拓展提供了強有力的資金支持。資本市場的助力使得Crystal Clear Technology能夠更快地實現規(guī)模擴張和產業(yè)升級,成為電子行業(yè)的一顆璀璨明星。
以上五個故事雖然是根據一般情況和行業(yè)趨勢虛構的,但它們反映了一個電子企業(yè)在發(fā)展過程中可能遇到的挑戰(zhàn)和機遇,以及如何通過技術創(chuàng)新、戰(zhàn)略合作、國際化布局、環(huán)保理念和資本市場支持等方式實現快速成長。當然,每個企業(yè)的發(fā)展歷程都是獨特的,Crystal Clear Technology公司的發(fā)展故事也必然有其獨特之處。
面對全球電子市場的競爭壓力,Crystal Clear Technology決定加快國際化步伐。公司先后在多個國家設立研發(fā)中心和生產基地,利用當地的資源和優(yōu)勢,提升產品的競爭力和生產效率。同時,公司還積極參與國際展覽和交流活動,與國際同行建立廣泛的合作關系,為公司的發(fā)展注入了新的活力。
隨著技術的不斷進步,Diodes Incorporated始終保持著對新技術研發(fā)的投入。其中,公司推出的首款碳化硅(SiC)蕭特基勢壘二極管(SBD)就是一個重要的里程碑。這款產品的推出,不僅大幅提高了半導體器件的效率和高溫可靠性,還滿足了市場對降低系統(tǒng)執(zhí)行成本和減少維護需求的期望。這一技術創(chuàng)新的突破,進一步鞏固了Diodes Incorporated在半導體行業(yè)中的領先地位。
隨著國內市場的逐漸飽和,Acutechnology公司開始將目光投向國際市場。公司制定了國際化發(fā)展戰(zhàn)略,通過在海外設立分支機構、參加國際展會等方式拓展海外業(yè)務。同時,公司還積極引進國際先進技術和管理經驗,提升企業(yè)的整體競爭力。這些舉措為公司的長遠發(fā)展注入了新的活力。
在國內市場取得成功后,AW Industries Inc開始尋求國際化發(fā)展。公司首先選擇了幾個具有潛力的海外市場進行拓展,并通過與當地企業(yè)合作、建立銷售網絡等方式逐步打開市場。隨著國際化戰(zhàn)略的深入實施,公司的業(yè)務范圍不斷擴大,國際市場份額也逐步增加。
ARM體系架構與編程視頻下載址地:http://www.itcast.net/course/detail/2589 Linux從入門到精通視頻教程主要對Linux系統(tǒng)的概念、使用、原理和驅動開發(fā)等方面的內容進行講解。下載地址:http://student.csdn.net/space.php?do=course&cid=2590&ac=d ...… 查看全部問答∨ |
|
環(huán)境:wince 開發(fā)環(huán)境:vs 2005 項目為vc下的智能設備應用程序 我繼承了combobox類,寫了自己的新類CMyComboBox.我添加了OnVScroll消息,可是設置斷點根本沒有響應啊? 我是想將VScroll的寬度弄寬一些,這樣便于用戶拖拽的時候選取 void CMyCom ...… 查看全部問答∨ |
我在WINCE開發(fā)一個串口 通信程序. 其主要代碼(讀串口的代碼) 如下:(在單獨一個線程進行讀操作) //清空串口 PurgeComm(m_hComm, PURGE_RXCLEAR|PURGE_TXCLEAR);   ...… 查看全部問答∨ |
大家好,我定制的的WINCE系統(tǒng)。我發(fā)現我復制文件到設備上的WINDOWS目錄.復制到WINDOWS目錄的文件,在機器重啟后也沒有丟失,是什么原因呀?我的機器有WINDOWS和BINFS,NANDFLASH這樣的文件夾!據說WINDOWS下面是不能保存文件的呀?奇怪!1… 查看全部問答∨ |
這幾天一直在看stm32 的通用定時器, 對定時器的輸出比較很是迷惑,主要有以下幾點: 1、輸出模式有 Timing、Active、InActive、Toggle 等幾種模式, 這幾種模式有什么區(qū)別? 或者說各有什么用途? 2、 根據TIMx_CCMR 中的OC1M ...… 查看全部問答∨ |
打個比方: PWM1(56腳)與PWM2(54腳)是一對PWM口,可以配置為一對極性相同或相反的PWM輸出. 但是能否將其中一個端口配置為PWM功能口,而另一個端口配置為普通IO口呢?… 查看全部問答∨ |
LED散熱途徑依據不同的封裝技術,其散熱方法亦有所不同,而LED各種散熱途徑方法約略可以下圖三示意之: LED散熱途徑散熱途徑說明: 從空氣中散熱 熱能直接由System circuit board導出 經由金線將熱能導出 若為共晶及Flip chip制程, ...… 查看全部問答∨ |
內容包括:LaunchPad 入門資料,有安裝軟件、有例子、有GRCC使用等 [ 本帖最后由 exiao 于 2012-7-1 13:10 編輯 ]… 查看全部問答∨ |