1. 程式人生 > >#隨便寫寫

#隨便寫寫

  第二次寫部落格誒,哈哈。誇下自己沒忘了這個事!  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