#隨便寫寫
第二次寫部落格誒,哈哈。誇下自己沒忘了這個事! Ps:不過週末真是幹什麼都沒勁兒!
最近公司在做CMMI認證,一直幫著處理一些相關的文件!偶爾會處理下以前軟體的bug。想不出應該從哪開始說起.....
直奔主題:
前幾天看了STM32上SPI和I2C的程式碼實現,一些很基礎的東西,工作上也用過幾次,包括以前學習51微控制器的時候也都有接觸過。說簡單的話可能就是自己“坐井觀天”了。但話說回來,工作上用到這些也就只需要會用就行,很多demo都有很好的封裝,若非遇到特別棘手的bug之外,一般不需要我們過多深究,意義不大。
在這裡梳理一些簡單的概念(整理自正點原子STM32開發手冊):
IIC:(Inter-Integrated Circuit,內部積體電路)
1.半雙工通訊方式,高速IIC速率可達400Kbps以上;
2.資料傳輸過程中3種訊號:起始訊號,停止訊號,應答訊號; ps:起始訊號必須有,另外兩個不是必須
起始訊號:SCL為高,SDA由高到底跳變
停止訊號:SCL為高,SDA由低到高跳變
應答訊號:(SCL每個高電平傳送一位資料,所以要在SCL為高時保證所需傳送資料的有效性)每傳送1B(位元組(8位(bit)))之後,在SCL第9個高電平時傳送器會釋放資料線佔用,由接收器反饋一個應答訊號(低電平有效)給傳送器,表示成功接收資料,若為高電平(規定為非應答位NACK(不必深究,只需瞭解高電平位接受失敗))則表示接收失敗。
這些在時序圖都能很好地體現出來!
3.從時序圖也可以看出SCL和SDA在空閒狀態都是高電平,具體可以用萬用表測量(忘了具體電壓是多少來著了......);
4.傳輸過程為邊沿觸發,即SCL電平上升沿表示開始傳送;
5.貼一個24C02(EEPROM)示意圖:WP:WriteProtect,A0~A2為不同記憶體大小晶片的對應地址。地址共8位,1 0 1 0 A2 A1 A0 W/R:最低位:1為讀,0為寫(主機對Eeprom)
6.相關參考程式碼應該很容易搜到。不列舉!(Emmm.....我還是比較喜歡知識層面的東西,本身也比較懶動手,哈哈!希望慢慢改正!)
SPI:(Serial Peripheral interface,序列外部裝置介面)
1.主要應用在Flash,Eeprom,實時時鐘,AD,DSP和數字訊號解碼等;
2.高速,全雙工,同步匯流排(自己本身有時鐘訊號,都為同步匯流排!):MOSI,MISO,SCLK,CS;
3.貼圖吧,打字太慢了!!! STM32 SPI介面可配置為支援SPI協議或者支援I2S音訊協議,預設是SPI模式。可以通過軟體切換到I2S方式。
4.先寫這麼多,下次補上SPI!!!
對了,再寫一點關於4G模組的:是近期做的一個安防監控(功能還挺全:Wifi,4G,GPS。我是主要負責主控(微控制器STM32L0),還有手機端的App等)專案上有用到。第一次用。簡單的說一下自己的理解,我也是剛接觸瞭解的很片面,還是從微控制器的角度。
除了正常的上電,關機外,還有就是AT指令的應用。At指令主要是4G模組和微控制器之間的通訊,通過串列埠收發不同的字串指令來實現各種功能,比如簡訊,儲存,電話,GPRS等。當然負責Linux的工程師會接觸到其他東西,我暫時還沒有~這些指令都可以在網上搜到具體的。
另外說兩點:
1.在用串列埠工具除錯4G模組時,需要斷開模組與微控制器的串列埠連線!!!因為同時只允許一個串列埠輸入資訊(具體原因我下去找找,改天貼上來)!
2.模組當然有不同型號,操作也有細微差別,原本該該專案是用EC20,國外版用的EC25。後來改到全球通的EG25。 問題隨之而來,以前的程式碼不能正常開機!(哈哈哈,突然想不起來拉低哪一個引腳了...總之EG25上電後要拉低對應一個引腳100ms以上,明天去查一下,再補上來!!!)
3.貼一段關於4G微控制器通訊AT指令的程式碼:
static void UrcSmsSet ( void ) { UartSend ( &huart4, "AT+QCFG=\"urc/ri/smsincoming\",\"pulse\",1000,1\r\n", 44 ); CSStep = SetUrcSmsSteping; } static void UrcOtherSet ( void ) { UartSend ( &huart4, "AT+QCFG=\"urc/ri/other\",\"off\",120,1\r\n", 38 ); CSStep = SetUrcOtherSteping; } static void SetModule4gSmsFormat ( SmsFormat smsFormat ) { if ( smsFormat == SmsFormatEnd ) return; else if ( smsFormat == SmsFormatText ) { UartSend ( &huart4, ( uint8_t* ) "AT+CMGF=1\r\n", 11 ); CSStep = SetSmsModeSteping; } else if ( smsFormat == SmsFormatPdu ) { UartSend ( &huart4, ( uint8_t* ) "AT+CMGF=0\r\n", 11 ); CSStep = SetSmsModeSteping; } printf ( "SetModule4gSmsFormat \r\n" ); } static void SmsFormatSet ( SmsFormat smsFormat ) { SetModule4gSmsFormat ( smsFormat ); } static void UrcDelaySet ( void ) { UartSend( &huart4, "AT+QCFG=\"urc/delay\",1\r\n", 23 ); CSStep = SetUrcDelaySteping; }
4.好啦,就先寫這麼多。去吃飯了!!!
給自己打打氣,“加油!!!”
下週爭取能想起來寫部落格!!!!
&n