3 硬件结构
由于CyFi使用的是星型广播式网络协议,所有消息需要经过中心Hub,故实现节点A到节点B数据通信的过程如下:节点A通过I2C协议采集多功能板A的CapSense触摸滑块的位置、3个LED灯的亮灭情况等数据,并与目标节点B的ID号一起通过RF发送出去;Hub检测到网络中有消息后,再根据消息中的目标节点ID将消息转发出去,同时将数据保存到缓存中等待PC机读取;节点B接收到消息之后根据消息中的数据,同样通过I2C协议控制多功能板B上的3个LED灯的亮灭。其中Hub所在设备FTPC有2个PSoC内核:主内核实现USB—I2C转换和各个板卡(包括从内核)的编程功能;从内核实现Hub功能,同时通过I2C与主内核连接。系统功能框图如图3所示。
4 软件设计
4.1 PSoC软件设计
CY3271套件的光盘中提供了各个PSoC的设计样例,本文中PSoC部分的设计就是在这些样例的基础上修改而成的。为了实现上述功能,需要在节点A发送的消息中添加目的节点B的ID信息,以便Hub将接收到的消息再转发出去。每个CyFi收发器有2种ID;一种为6字节的Radio ID,此ID在收发器出厂时烧入,不可更改且全球唯一;另一种为1字节的Node ID,此ID在节点绑定时确定,可以事先指定也可以由Hub动态分配。由于Ra-dio ID较复杂,开发人员在开发过程中可以忽略RadioID,而只关注Node ID。
对于多功能板A可直接使用光盘上的MF_CS_SLIDE样例,不需要修改。对于节点A使用的RF_12C_BRIDGE样例,主函数中需修改调用CyFiSNP_BindStart()函数时的参数,如下:
其中,采集并发送消息的函数sendNewTxMsg()中发送的消息类型必须修改为CYFISNP_API_TYPE_CONF_BCDR,且应在调用的loadTxData()函数中添加如下一句以添加节点B的ID信息:
txApiPkt.payload[I2C_PAYLOAD_MAX]=DEV_ID_RX;
对于Hub使用的RF_HUB样例,首先需要将用户模块CYFISNP的Device ID assignment属性设置为Preas-signed Device ID,以便节点A、B使用指定的ID绑定成功。重新编译后,在ServeSNPPackets()函数中接收到CYFISNP_API_TYPE_CONF_BCDR类型的消息之后,添加如下代码:
对于节点B使用的RF_I2C_BRIDGE样例,其主函数同样需要修改CYFISNP_BindStart()函数的参数,同时还需暂存接收到的消息。核心代码如下:
其中,负责接收消息并且控制多功能板B的函数receiveNewRxMsg()中必须与节点A对应的将消息类型修改为CYFISNP_API_TYPE_CONF_BCDR,且在其中调用的SetI2CData()函数如下: