第二次写博客诶,哈哈。夸下自己没忘了这个事! 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.好啦,就先写这么多。去吃饭了!!!
给自己打打气,“加油!!!”
下周争取能想起来写博客!!!!