1. 綜述
由上篇博客可知道IIC協議如何用代碼實現,本篇博客就不涉及協議內容,只講解如何使用。
本次的實驗傳感為:DS3231(時鐘模塊),對于時鐘模塊的具體信息我也就不多介紹,大家可以自行度娘,具體功能無非就是讓單片機中能夠起到獲取時間的作用。該模塊是可以由IIC協議去驅動的,再加上所要的操作也是比較簡單,部分剛接觸IIC協議的小伙伴可以拿來練手的一個模塊。
2. 明確任務順序
個人習慣,在每驅動一個新傳感的時候,我會將我要完成的傳感分為幾個任務點。接下來就展示一下我在寫DS3231模塊時的任務欄。
一.硬件部分
1.完成排針焊接
2.完成傳感引角和單片機引角的接線
二.軟件部分
1. 找到該傳感的官方手冊并認真閱讀
2. 找到并定義該傳感的地址(7位地址、8位地址)
4. 完成讀寫函數的代碼
5. 測試傳感是否有響應
6. 查看手冊,了解傳感的工作模式
7. 完成傳感參數初始化
8. 傳感數據的獲取
根據上面這些小任務一一解決,這樣一來,大多數傳感就能成功驅動了,這里在給一個建議,驅動傳感器的代碼最好不要一次性全部寫完再進行測試,這樣成功率不高,并且會大大增加你找問題的難度,將每個功能函數測試完再進行下一個功能函數的編寫,會大大加大你的效率。
3. 具體任務實現步驟
3.1. 硬件部分
在STM8S103芯片中,我所定義的IIC協議中的SDA引角為PD3,SCL引角為PD4,該時鐘模塊所需提供的電源為3.3V。所以接線圖如下。
3.2. 軟件部分
(1)官方手冊
我這里提供的是全英版的官方手冊,多看點英文對你有好處的。
鏈接:https://pan.baidu.com/s/1Oo6o68SoVr7gt8tPZIoQxw
提取碼:uzih
(2)器件地址
在說明手冊中,我們可以在第16頁的右下角找到下面這句話:
The slave address byte contains the 7-bit DS3231 address, which is 1101000, followed by the direction bit (R/W), which is 0 for a write.
這句話的大意為,從機的7位地址為1101000,后跟一位讀寫位,讀寫位為0時是寫位。即7位地址的為0x68,8位地址為0xD0。
(3)寄存器地址
DS3231的寄存器地址都在這了,大家可根據所需要用的功能定義相應的寄存器。
以下是我在頭文件所定義的格式,因為我只需要獲取時間,不需要進行其他操作,所以部分寄存器沒有使用。
#define DS3231_Address 0xD0 //設備地址
#define Seconds_Register 0x00 //秒鐘寄存器
#define Minutes_Register 0x01 //分鐘寄存器
#define Hour_Register 0x02 //小時寄存器
#define Day_Register 0x03 //星期寄存器
#define Date_Register 0x04 //日期寄存器
#define Month_Register 0x05 //月份寄存器(第七位是世紀位)
#define Year_Register 0x06 //年份寄存器
4. 例程
4.1 編譯環境
我的編譯環境是IAR,這款軟件是現在STM8的主流平臺,比較推薦。不過我打算等到STCubeMX更新出比較方便的版本后再去使用Keil5,因為我在用STM32的時候就是利用Keil5,的確很方便,你們也可以學著用一下。
4.2 主芯片
我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一樣(外設和CPU頻率,FLASH),在代碼相同的情況下均可進行燒寫。
4.3 庫文件的添加
我們的工程可以在IAR中的官方例程中復制,操作過程:打開STM8S_StdPeriph_Lib(這是一個官方的庫文件,下載IAR STM8包的時候就攜帶,里面有庫文件和相對應的例程),將Libraries文件復制到你工程所在的文件下,并將有關于ADC的庫文件添加到你的工程列表當中。添加完成后,就可以開始編寫代碼了(如果你將全部的庫文件都添加進來的話,編譯程序后庫文件還有紅點報錯的話,這是因為你選的芯片上沒有該功能,你需要將其刪掉才能不報錯。)如圖。
4.4 代碼
4.4.1 SDA、SCL引角的定義
我這里將SDA、SCL都設置為了推挽輸出,具體為什么可與參考上一片IIC協議講解。
//IIC引腳
GPIO_Init(IIC_SCL_GPIO_Port, IIC_SCL_Pin, GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(IIC_SDA_GPIO_Port, IIC_SDA_Pin, GPIO_MODE_OUT_PP_HIGH_FAST);
4.4.2 DS3231句柄定義
為了能夠方便數據的管理,所以我定義了DS3231的一個句柄。
typedef struct DS3231
{
uint8_t uSeconds; //秒
uint8_t uMinutes; //分鐘
uint8_t uHour; //小時
uint8_t uDay; //星期
uint8_t uData; //日期
uint8_t uMouth; //月份
uint8_t uyear; //年份
uint8_t uTime[3]; //將秒、分鐘、小時、日期包括在內
}DS3231_HandleTypeDef;
4.4.3 BCD格式和B格式轉換
在手冊中可以看到,寫入到DS3231中的格式是BCD格式,而讀取到的卻是B格式,所以我們需要兩個函數將其轉換,也方便我們察看數據的結果。
uint8_t Byte_Transform_BCD(uint8_t uData)
{
uint8_t i, j, uBCD_Code;
i = uData / 10;
j = uData % 10;
uBCD_Code = j + ( i << 4 );
return uBCD_Code;
}
uint8_t BCD_Transform_Byte(uint8_t uData)
{
uint8_t uByte_Code;
uByte_Code = (uData & 0x0f);
uData >>= 4;
uData &= 0x0f;
uData *= 10;
uByte_Code += uData;
return uByte_Code;
}
4.4.4讀寫函數編寫
讀寫函數我們如果不去看手冊說明的話是無法編寫代碼的,所以我們需要去看手冊,根據手冊中的IIC命令順序進行編寫代碼。
這幅圖為 IIC數據傳輸概述。
寫函數流程圖:
這個流程圖是在DS3231中的官方圖,根據圖中的命令可以寫出代碼,其中,代碼中出現IIC_HandleTypedef * iicHandle等參數,是IIC的句柄,具體可看上一篇博客,下面所出現的也是一樣的意思。
uint8_t vSen_DS3231_Write_Bytes(IIC_HandleTypedef * iicHandle, uint8_t Register_Address, uint8_t Data_Byte)
{
vIIC_Start_Signal(iicHandle); //1. IIC_Start ; 起始信號
vIIC_SendByte(iicHandle, Slave_Address); //2. IIC_Send Device Address(W); 發送(設備地址)告訴總線即將操作的設備
if(!bIIC_ReadACK(iicHandle)) //3. IIC_ReadAck ; 等待響應
{
vIIC_Stop_Signal(iicHandle);
return FALSE;
}
vIIC_SendByte(iicHandle, Register_Address); //4. IIC_Send Register Address ; 發送(寄存器) 告訴設備我們即將操作的寄存器
bIIC_ReadACK(iicHandle); //5. IIC_ReadAck ; 等待響應
vIIC_SendByte(iicHandle, Data_Byte); //6. IIC_Send the data to Reg ; 發送(數據) 寫入數據到指定設備的寄存器中
bIIC_ReadACK(iicHandle); //7. IIC_ReadAck ; 等待響應
vIIC_Stop_Signal(iicHandle); //8. IIC_Stop ; 結束信號
return TRUE;
}
讀函數流程圖:
uint8_t vSen_DS3231_Read_Bytes(IIC_HandleTypedef * iicHandle, uint8_t Register_Address)
{
uint8_t uRev_Register_Data = 0x00;
vIIC_Start_Signal(iicHandle); //1. IIC_Start ; 起始信號
vIIC_SendByte(iicHandle, Slave_Address); //2. IIC_Send Device Address(W); 發送(設備地址)告訴總線即將操作的設備
上一篇:基于STM8的UART發送和中斷接收
下一篇:基于STM8的TIM定時器操作---STM8-第三章
推薦閱讀
史海拾趣
在汽車電子市場取得成功后,Eris Tech開始將目光投向工業控制領域。通過深入了解工業控制市場的需求和技術特點,公司成功開發出多款適用于工業控制領域的半導體產品。這些產品不僅具有高性能、高可靠性等特點,還能滿足工業控制領域對實時性、安全性等方面的要求。隨著工業控制領域的不斷拓展,Eris Tech在該領域的市場份額也逐漸增加。
藍箭電子的前身是佛山市無線電四廠,創建于七十年代初。隨著時代的變遷和市場的需求,該廠在1998年成功轉制為有限責任公司,邁出了向現代化企業轉型的重要一步。這次轉型不僅為公司注入了新的活力,也為后續的發展奠定了堅實的基礎。
在電子行業的發展過程中,APTA Group Inc也遭遇了不少挑戰。例如,原材料價格的波動、國際貿易環境的變化等都曾給公司帶來不小的壓力。然而,APTA并未被這些困難擊垮,而是積極調整戰略,優化生產流程,降低成本,提高產品質量。這種在挑戰中展現出的韌性和應變能力,使得APTA能夠在逆境中保持穩健的發展態勢。
Anytek始終堅持以創新為驅動,不斷推出具有市場競爭力的新產品。2007年,公司自主研發的創新型產品“高清汽車行車記錄儀”面世,這款產品以其高清畫質、穩定性能和易用性等特點,迅速占領了市場制高點。隨后,Anytek又于2008年推出了行業唯一一款雙鏡頭的“雙鏡頭行車記錄儀”,這一創新設計進一步提升了行車記錄儀的功能性和實用性,贏得了市場的廣泛認可。
品質一直是BLT Circuit Services公司的核心競爭力。公司注重品質管理,建立了嚴格的質量控制體系,從原材料采購到生產過程中的每一個環節都進行嚴格把關。正是這種對品質的執著追求,使得BLT Circuit Services的產品在行業內贏得了良好的口碑,為公司贏得了大量的忠實客戶。
Falco Electronics自創立之初就注重技術創新。公司創始人深知,在電子行業,只有不斷推陳出新,才能在激烈的市場競爭中立足。因此,公司投入大量研發資金,吸引了一批優秀的科研人才。經過不懈努力,Falco Electronics成功開發出了一款具有革命性的新型芯片,這款芯片在性能上遠超同類產品,迅速在市場上占據了一席之地。
請問DG-128064的字是怎么拼的? 比如: //四 { {0X00,0X00,0X00,0X04,0XFF,0XFE,0X44,0X44}, {0X44,0X44,0X44,0X44,0X44,0X44,0X44,0X44}, {0X48,0X3C,0X50,0X04,0X40,0X04,0X7F,0XFC}, {0X40,0X04,0X00,0X00,0X00,0X00,0X00,0X00}}, 是怎 ...… 查看全部問答∨ |
直接對模塊的輸入打一拍,為什么仿真時看不到效果呢? 打拍輸出的信號與輸入波形一致,并沒有按預想的向后延遲一拍? 直接對模塊內部信號打拍有效果. 以前從沒碰到這么詭異的問題,難道與仿真環境設置有關嗎? 請高手指點一二… 查看全部問答∨ |
現在要做一個項目,需要用到單片機進行模擬信號的采集.但是需要在同一時間點進行同時采集,然后進行數據傳輸. 請問有沒有合適的8位或者16位的單片機,能夠對2路(以上)信道同時進行信號采集. 單片機采集后信號的輸出可以是多路一起輸出,也可以是單路 ...… 查看全部問答∨ |
|
以下分別是用release下串口的輸出 Windows CE Kernel for ARM (Thumb Enabled) Built on Mar 13 2003 at 22:52:56 ProcessorType=0920 Revision=0 sp_abt=ffff5000 sp_irq=ffff2800 sp_undef=ffffc800 OEMAddressTable = 8c2013bc W ...… 查看全部問答∨ |
昨天裝了一個WINCE.NET with platform builder 4.2版本的 然后 裝了 EVC4.0和一個standard SDK 裝 完后 運行 PB和 EVC 。就是 一個 簡單的 Helloworld 程序 ,運行的時候 總是 提示 one or more fills of emulator con\'t find..... 本人 菜鳥 ...… 查看全部問答∨ |
我要實現的是4X4鍵盤顯示電路 我鍵盤接P2口 顯示電路用LED(8位) ,使用的是 (P3.1)串行通行 現在我要讓鍵盤每一個鍵對應顯示 1,2,3,....F,0, 我的單片機初始狀態顯示了 LED 全亮 可我的按鍵 ...… 查看全部問答∨ |
求救啊!哪位大人能知道有關于“抗干擾編碼的基本原理”的資源或文章啊! 或者比較了解的,跟我說一下啊! 不過是關于網絡的方面的!!!!!!!!! 我在網上搜了好久的沒找到從網絡方面回答這一問題的! 導師的作業馬上要交啊!知道的大人幫 ...… 查看全部問答∨ |
各位大蝦,8962的UART1的兩個端口可以做GPIO輸出么?為什么我把UART1所用的兩個I/O口PD2,PD3設為GPIOPinTypeGPIOOutput(),確不能拉高呢。 本來跑是的TI的uart_echo例程,和PC機進行UART通信,板子可以給PC機發數據并且PC可以正常接收,但是 ...… 查看全部問答∨ |
usb2.0高速收發器 和FPGA連接 需要在FPGA內部設計ULPI接口 看了USB3300的資料 感覺很迷茫 不知道該從哪里下手 有懂得 或做過得 幫忙指點一二 … 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析