WiFi 模块的单片机开发 一直以来都在开发单片机,最近有智能家居的案子需要开发用到WiFi模块,于是刚刚上手RAK411;经过半年时间的了解/学习,总结如下: 一、概念: 1)、Wi-Fi:大部分单片机工程师的理解就是手机/笔记本上面和家里路由器的这些东西叫WiFi,但是具体到物联网等相关行业的时候也经常遇到;这里我说一下我理解的WiFi概念; 按照我的理解是基于2.4G(当然也有5G频段的WiFi)自由无线频段的无线通信方式,简单的理解就是一种跑在2.4G无线上面的协议叫WiFi; 分层理解就是:硬件层的2.4G收发器,和软件层的WiFi协议组成了WiFi; 具体WiFi协议很复杂,据说是类似于3G网络的那种协议,只是简化了; 2)、AP:热点,类似于3G网络的基站,家里的路由器就是AP,手机也可以开AP,我们在WiFi列表里面收到的就是AP的SSID,即:WiFi AP的名字; 3)、STA:Station的缩写,站点的意思,就是你可以找到附近环境里面的可见的AP,但是STA之间是不可见的,STA与STA通信需要通过AP才可以的;这类似于手机,手机之间打电话当然需要基站来传递啦; 4)、TCP/IP:这个是互联网基础的协议,IP就是地址,全球唯一,TCP是网络协议,同样还有UDP,这两者有区别,但是我没有太仔细研究下去,UDP是发送后不管应答,TCP是有应答的,因此TCP更可靠; 5)、MAC地址:就是WiFi本身有个物理地址,48bit,类似于网卡的MAC地址; 信号强度:dB;就功率的单位,具体怎么理解/换算后面再撰写更详细**研究; 6)、信道:就是2.4G不是刚刚好的2.4G,有一个频率范围,这个范围叫做带宽,这个带宽里又分成好多信道,每个信道又占用一定宽度带宽;好比说是:比如深南大道宽200米,有双向8车道,这样就有每个车道25米了(没考虑中间绿化了哈);但是有些车道又是共用的,比如向左和前行道路是共用的;下面图片就是很清楚说明了WiFi的信道和频段的分布: 这下又有疑问了,AP和STA通信的时候,这个信道在哪个上面是由谁决定的呢?其实,在AP建立的时候信道就确定了,下面的STA要和当前的AP通信就必须选择同一个信道,在WiFi运行的过载中信道号也是不改变的,暂时还没听说过WiFi做跳频处理;大家可以用笔记本登入家里的WiFi试试,里面肯定有一项是选择AP信道。 7)、DHCP SERVER、 DHCP CLIENT: 就是开启是否IP地址由AP分配给你的STA,DHCP SERVER是针对AP模式的,就是要不要开始这个IP分配功能, DHCP CLIENT是针对STA的,是自己的静态IP还是接受AP的分配;这个需要根据客户项目需要选择啦; 二、术语: Beacon 信标:就是AP每隔一段时间就会发出了,告诉周围环境里面的Station存在AP;周围环境的STA马上就知道了,就好比我们去一个饭店吃饭的时候总是习惯用手机搜索一下周围环境的WiFi,列表里面的AP名字/SSID就是通过beacon发出来的,好像一般是100ms发一次,时间也是可以设置的; WPA/WPA2/WEP:就是加密方式啦,接入一个新的WiFi 热点要么免费,要么加密,需要输入密钥,这样才能保证别人不蹭网,也能保证网络的安全性;WPA2好像内部用的是AES加密方式,PS:AES貌似是目前最强的加密方式,分成128/196/256bit加密密钥; 三、硬件设计: 411模块硬件设计是很简单的,无非是电源脚,复位脚,配置脚,通信口,指示脚,中断脚; 这里简单起见就直接贴个手册里面的参数电路来;对于单片机工程师来说毫不费力; 四、软件驱动编写: 就是SPI的收发函数了; 中断有数据的时候就会产生,SPI发时钟去读即可(空闲是0,有数据待读取出来是1); 1)、初始化单片机SPI口,注意模块的SPI时钟最高支持16MHz;初始化GPIO/开IO中断; void SPI_Init(void) { //初始化单片机SPI口(注意SPI时钟不能太高); CPOL = 0-------------------------------------时钟信号在低电平时空闲;
CPHA = 0------------------------------------数据在时钟上升沿锁存,在时钟下将沿传输;
MSB_FIRST------------------------------------数据高位首先发送;
8 BIT MODE-----------------------------------数据宽度为 8 位;
CS----------------------------------------------从机选择信号低有效; } void GPIO_Init(void) {//设置连接到模块INT脚的那个GPIO口为输入状态; //开启该GPIO的中断; } 2)、void SPI_Send_Bytes(uint8_t* p_temp,uint8_t data_len) {//不同单片机,修改底层发函数了 } 3)、void SPI_Get_Bytes(uint8_t* p_temp,uint8_t data_len) { //不同单片机,修改底层收函数了 } 4)、GPIO中断函数编写 void GPIO_PINx_IRQ_Handler(void)
{ while(查询INT脚的电平==1) {SPI_Get_Bytes(x,y); } } 五、RAK411编程手册 RAK411-SPI 编程手册 V1.2.pdf详细介绍了模块的SPI指令和相关操作数; 六、上面是RAK411模块的简单使用方法,很简单,设计很快就能完成数据传输了;
|