stm32軟體模擬IIC讀取PX4FLOW光流感測器數據

来源:http://www.cnblogs.com/Cmoadne/archive/2016/07/08/5652069.html
-Advertisement-
Play Games

這段時間在做全國光電設計大賽,用到了px4的px4flow光流感測器,用軟體模擬iic讀取數據不定期會導致px4flow死機,查了資料和光流的源碼,發現這個光流用了stm32的硬體iic,所以對軟體模擬iic的時序要求可能更高一點所以在原子哥的iic程式上做了修改,代碼測驗後已經不會死機,做個筆記, ...


這段時間在做全國光電設計大賽,用到了px4的px4flow光流感測器,用軟體模擬iic讀取數據不定期會導致px4flow死機,查了資料和光流的源碼,發現這個光流用了stm32的硬體iic,所以對軟體模擬iic的時序要求可能更高一點所以在原子哥的iic程式上做了修改,代碼測驗後已經不會死機,做個筆記,保存一下。

  1 #include "myiic.h"
  2 #include "delay.h"
 15 
 16 //初始化IIC
 17 void IIC_Init(void)
 18 {            
 19   GPIO_InitTypeDef  GPIO_InitStructure;
 20 
 21    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB時鐘
 22 
 23   //GPIOB10,B11初始化設置
 24    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
 25    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通輸出模式
 26    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推輓輸出
 27    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
 28    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
 29    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
 30    IIC_SCL=1;
 31    IIC_SDA=1;
 32 }
 33 //產生IIC起始信號
 34 void IIC_Start(void)
 35 {
 36     SDA_OUT();     //sda線輸出
 37     IIC_SDA=1;          
 38     
 39     delay_us(1);    
 40     
 41     IIC_SCL=1;
 42     delay_us(2);                                                                                //4
 43     IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
 44     delay_us(2);                                                                                    //4
 45     IIC_SCL=0;//鉗住I2C匯流排,準備發送或接收數據 
 46 }      
 47 //產生IIC停止信號
 48 void IIC_Stop(void)
 49 {
 50     SDA_OUT();//sda線輸出
 51     IIC_SCL=0;
 52     
 53     delay_us(1);
 54     
 55     IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
 56     delay_us(2);                                                                                    //4
 57     IIC_SCL=1; 
 58     
 59     delay_us(1);
 60     
 61     IIC_SDA=1;//發送I2C匯流排結束信號
 62     delay_us(2);                                                                           //4
 63 }
 64 //等待應答信號到來
 65 //返回值:1,接收應答失敗
 66 //        0,接收應答成功
 67 u8 IIC_Wait_Ack(void)
 68 {
 69     u8 ucErrTime=0;
 70     SDA_IN();      //SDA設置為輸入  
 71     IIC_SDA=1;
 72     delay_us(1);                                                                        //1
 73     IIC_SCL=1;
 74     delay_us(1);                                                                        //1
 75     while(READ_SDA)                 //可能可以把數搞大點
 76     {
 77         ucErrTime++;
 78         if(ucErrTime>250)
 79         {
 80             IIC_Stop();
 81             return 1;
 82         }
 83     }
 84     IIC_SCL=0;//時鐘輸出0        
 85     return 0;  
 86 } 
 87 //產生ACK應答
 88 void IIC_Ack(void)
 89 {
 90     IIC_SCL=0;
 91     
 92     delay_us(1);
 93     
 94     SDA_OUT();
 95     IIC_SDA=0;
 96     delay_us(2);                                                                    //2
 97     IIC_SCL=1;
 98     delay_us(2);                                                                    //2
 99     IIC_SCL=0;
100 }
101 //不產生ACK應答            
102 void IIC_NAck(void)
103 {
104     IIC_SCL=0;
105     
106     delay_us(1);
107     
108     SDA_OUT();
109     IIC_SDA=1;
110     delay_us(2);                                                                    //2
111     IIC_SCL=1;
112     delay_us(2);                                                                    //2
113     IIC_SCL=0;
114 }                                          
115 //IIC發送一個位元組
116 //返回從機有無應答
117 //1,有應答
118 //0,無應答              
119 void IIC_Send_Byte(u8 txd)
120 {                        
121     u8 t;   
122     SDA_OUT();         
123     IIC_SCL=0;//拉低時鐘開始數據傳輸
124     for(t=0;t<8;t++)
125     {              
126         IIC_SDA=(txd&0x80)>>7;
127         txd<<=1;       
128         delay_us(2); //對TEA5767這三個延時都是必須的  //2
129         IIC_SCL=1;
130         delay_us(2);                                                                        //2
131         IIC_SCL=0;    
132         delay_us(2);                                                                        //2
133     }     
134 }         
135 //讀1個位元組,ack=1時,發送ACK,ack=0,發送nACK   
136 u8 IIC_Read_Byte(unsigned char ack)
137 {
138     unsigned char i,receive=0;
139     SDA_IN();//SDA設置為輸入
140     for(i=0;i<8;i++ )
141     {
142         IIC_SCL=0; 
143         delay_us(2);                                                             //2
144         IIC_SCL=1;
145         receive<<=1;
146         if(READ_SDA)
147             receive++;   
148         delay_us(2);                                                                        //1
149     }                     
150     if (!ack)
151         IIC_NAck();//發送nACK
152     else
153         IIC_Ack(); //發送ACK   
154     return receive;
155 }

空行間隔的為新增延時,和註釋不一樣的為改了的延時


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通常,我們會對於一個文本文件數據導入到資料庫中,不多說,上代碼。 首先,表結構如下. 其次,在我當前D盤中有個文本文件名為2.txt的文件。 在資料庫中,可以這樣通過一句代碼插入。 1) bulk insert: 為Sql server 中一個批量插入的操作 2)T_Demo: 要插入的表 3)'D ...
  • 在C# 6.0,當我們使用Dictionary時,我們可以使用新語法,來去簡化程式以提高效率。 public Dictionary<string, object> OldToolLocations = new Dictionary<string, object>() { {"ToolLocation ...
  • Extjs Mvc模式下的整個MVC框架體系即下圖: 包含了Controller(實現方法層),Store(數據來源管理層),View(頁面佈局層)。之所以用MVC我想是因為減輕針對某一頁面的單一的JS 的開發,為啥呢,可以看一下沒有使用MVC模式的Extjs 的編碼: (因為我也是新手,所以可能里 ...
  • 為了使用方便,對Autofac container的簡單封裝,記錄如下,備以後用或分享給大家,歡迎討論! 使用方法如下: ...
  • MD5的加密方法很多,今天說下MD5的十六進位加密···先貼方法···· 根據方法 GetMD5就可以得到想要的MD5十六進位加密 ...
  • 是不是在安裝vs2010 vs2012 vs2013 vs2015的時候,好不容易安裝完成了,卻有一個警告:“xxxx,沒有驗證對象的數字簽名。”? 你用迅雷下載的安裝包有問題!!!你用迅雷下載的安裝包有問題!!!你用迅雷下載的安裝包有問題!!! 刪了它吧,沒有什麼好懷疑的,好留戀的,無論你重裝多少 ...
  • 相信每個人對註冊表並不陌生,在運行裡面輸入“regedit”就可以打開註冊表編輯器了。這東西對Windows系統來說可是比較重要的,也是病 毒常常會光顧的地方,比如病毒和惡意軟體常常會在註冊表的啟動項裡面寫入自己的啟動鍵值來達到自啟動的目的,有些病毒還會修改註冊表裡面來映像劫持殺毒軟 件,這是破壞系 ...
  • 本篇是講設計模式方面的,比較雜,不像書上的那樣。 我們先從很簡單的一個需求開始:“想讓系統中只存在一個SendEmailObject對象” 代碼: public class SendEmailObject { public bool Send() { Console.WriteLine("Email ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...