作者:周志强,华清远见嵌入式培训中心讲师。
要使用FS_11C14开发板实现点对点通信,需要对开发板上的ZigBee模块进行配置。下面我们先来介绍一下配置的过程。
1、首先执行ZigbeeCfg应用程序,会出现下图所示的界面:
图10-1 ZigBee配置界面 |
在设备管理器中查看我们所使用的串口并进行选择,波特率选为“115200”,数据位选择为“8”,校验位为“无”,停止位设为“1”,打开串口之后,进入到“ZLG页面”,即:
图10-2 网络配置界面 |
2、点击“获取信息”,我们就可以获得关于这块开发板的相关配置了。将设备类型选择为“终端设备”,PanID设置为“0x1000”,目的网络地址设置为对方开发板的网络地址,发送模式选为“单播模式”,同样的操作应用于另一块开发板,但是在操作的过程中我们需要注意的是两个开发板的PanID和通道号应设置为相同。这样我们在配置的实现上就完成了点对点的配置。
需要注意的是,在实验中可能会出现这样的一个现象:当打开串口之后,进行“本地信息”的获取的时候,会出现如图所示的情况,也就是无法获取到信息。
图10-3 配置错误示意图 |
导致上面结果的原因可能有:
(1)由于ZigBee模块的信息也是从串口中得到的,那么如果程序中出现了过多了关于数据显示的操作或者是对于串口的使用情况的话,就会导致时间的延时,那么当时间超过一定的规定之后还是没有获取到配置信息,那么就会出现上图所示的情况了。
(2)ZigBee模块本身的问题。该问题我们可以这样来解决,在FS_11C14开发平台上有这样的一个跳线:JP1。找到这个模块,用跳线帽将两个引脚进行短接,然后上电重启开发板。复位ZigBee之后,将跳线帽去掉,然后重启开发板就能正常使用了。
3、在实验中,我们通过数据的通信完成对点对点通信的理解。举一个例子:
在完成网络的配置之后,我们来看一下程序是怎么运行的。
case KEY_SEL:
switch(menu.numb)
{
case 1: //向对方发送“Hello ZigBee”数据
ZigBee_PutString("Hello ZigBee! ");
printf("\r\nSend Hello ZigBee! ");
break;
case 2: //向对方发送“开风扇”指令,控制对方风扇的开
ZigBee_PutString("FAN On ");
printf("\r\nSend Turn On FAN ");
break;
case 3://向对方发送“关风扇”命令,控制对方风扇的关
ZigBee_PutString("FAN Off ");
printf("\r\nSend Turn Off FAN ");
break;
case 4: //获取温/湿度信息,然后将信息发送给对方,对方的开发板会在OLED屏上将信息显示出来
i = Read_Temp_Hum(temp, hum);
...
通过现象看本质,我们来看一下上面的操作是怎么实现的呢。在ZigBee模块上我们只利用了它的数据传输引脚,而没有使用ZigBee模块的其他功能,硬件连线如图10-4所示:
图10-4 |
而在转接芯片上ZigBee接收来的数据会转变为附载到SPI总线上传输的数据。可以通过下面的连线看出转接过程是怎么实现的。
图10-5 |
在程序中我们通过ZigBee_PutString()函数利用ZigBee发送数据。其基本实现:
void ZigBee_PutString(uint8_t *pStr)
{
while(*pStr)
{
SPI752_PutChar(1, *pStr); //利用通道1每次发送一个字节
pStr ++;
}
}
SPI752_PutChar()函数的使用就说明了ZigBee模块中的串口数据与SPI总线上数据的转换过程。当对方收到发送的信息之后,比如如果这边发送了“FAN On ”这一控制信息后,会通过下面的过程将信息接收过来。
if(UART0_GetChar(&rd))
{
ZigBee_PutChar(rd);
}
if(ZigBee_GetChar(&rd))
{
UART0_PutChar(rd);
}
收到信息之后,对命令进行解析,并进行相关的操作。
if((buf[0]=='F') && (buf[1]=='A') //收到“FAN On ”命令
&& (buf[2]=='N') && (buf[3]==' ')
&& (buf[4]=='O') && (buf[5]=='n')
&& (buf[6]==' ') && (buf[7]==' '))
{
GPIOSetValue(PORT0, 2, 1); // 控制开风扇
}
else if((buf[0]=='F') && (buf[1]=='A')//收到“FAN Off ”命令
&& (buf[2]=='N') && (buf[3]==' ')
&& (buf[4]=='O') && (buf[5]=='f')
&& (buf[6]=='f') && (buf[7]==' '))
{
GPIOSetValue(PORT0, 2, 0); // 控制关风扇
}