#随便写写

浪尽此生 提交于 2020-04-08 07:32:23

  第二次写博客诶,哈哈。夸下自己没忘了这个事!  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模块时,需要断开模块与单片机的串口连接!!!因为串口信息发送端同时只能被一个设备占用,MCU或者PC机。

    2.模块当然有不同型号,操作也有细微差别,原本该该项目是用EC20,国外版用的EC25。后来改到全球通的EG25。  问题随之而来,以前的代码不能正常开机!(哈哈哈,突然想不起来拉低哪一个引脚了...总之EG25上电后要拉低对应PWRKEY引脚500ms以上。

 

 

 

    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.好啦,就先写这么多。去吃饭了!!!

 

给自己打打气,“加油!!!”

    下周争取能想起来写博客!!!!

 

  

         

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!