本帖最后由 yang_alex 于 2015-3-16 22:38 编辑
这个帖子昨天就写好了,只是验证的程序有些问题,本想解决了再一起写。结果有个网友很??那就先贴出来后面再补充吧。
无线的网络架构有多种,关键是挑个合适自己项目的。
项目中使用到的无线传输的网络拓扑很简单,点对点就可以了。刚开始的时候想照着文档《Atmel AT02607: Wireless Product Development Using Atmel Studio and ASF》的方法,自己在AtmelStudio中自己添加“AVR?2025 TAL component (Transceiver Abstraction Layer)”。结果添加完TAL component,在配置相关引脚时才发现这家伙有个坑。
我们知道,SAM R21 实际上是双芯片集成,说白了就是芯片封装内部吧AT86RF233芯片和SAM D21 连起来,封装成一个IC。从下面的图中可以看出,AT86RF233芯片是通过SPI连接到SAM D21 ,占用了PC16、PC18、PC19、PB30、PB31、PB00、PB15、PA20。
但是在上面添加的TAL component中,相关的配置竟然是下面这种:(文件:conf_trx_access.h)
- #if (SAMD || SAMR21)
- #ifndef AT86RFX_SPI
- #define AT86RFX_SPI SERCOM0
- #define AT86RFX_RST_PIN PIN_PA23
- #define AT86RFX_MISC_PIN PIN_PA23
- #define AT86RFX_IRQ_PIN PIN_PA22
- #define AT86RFX_SLP_PIN PIN_PA24
- #define AT86RFX_SPI_CS PIN_PA19
- #define AT86RFX_SPI_MOSI PIN_PA16
- #define AT86RFX_SPI_MISO PIN_PA18
- #define AT86RFX_SPI_SCK PIN_PA17
- #define AT86RFX_CSD PIN_PA23
- #define AT86RFX_CPS PIN_PA23
- #define LED0 LED0_PIN
复制代码
还是先找个SAM R21例子程序,在例子程序上改吧。LWMesh-Peer2Peer Application - SAM R21 Xplained Pro这个例子程序就是针对SAM R21 Xplained Pro开发版的,相关端口配置肯定不会错了。
也确实是正确的,但是相关定义却跑到板定义文件samr21_xplained_pro.h中了。
- #define AT86RFX_SPI SERCOM4
- #define AT86RFX_RST_PIN PIN_PB15
- #define AT86RFX_IRQ_PIN PIN_PB00
- #define AT86RFX_SLP_PIN PIN_PA20
- #define AT86RFX_SPI_CS PIN_PB31
- #define AT86RFX_SPI_MOSI PIN_PB30
- #define AT86RFX_SPI_MISO PIN_PC19
- #define AT86RFX_SPI_SCK PIN_PC18
- #define PIN_RFCTRL1 PIN_PA09
- #define PIN_RFCTRL2 PIN_PA12
- #define RFCTRL_CFG_ANT_DIV 4
复制代码
我猜测,ATMEL的写例子代码的人也发现了原来的代码不能用。原因估计是
SAMD 系列的PC16、PC18、PC19、PB30、PB31、PB00、PB15、PA20没有引出,回头再确认一下吧。如果真是这样,代码中完全可以把两种MCU分开。
参照文档《AVR2130_LWMesh_Developer_Guide_v1.2.1》,了解相关函数的功能,修改成自己需要的代码。
RF模块初始化
第1步:设置网络地址
NWK_SetAddr(0x0001);
注意:不同节点的网络地址不同,在这个例子里,一个是0x0001,一个是0x0000。
第2步:设置网络ID,也就是 PAN ID
NWK_SetPanId(0x1234);
第3步:设置无线通讯频率通道
PHY_SetChannel(0x0f);
第4步:设置无线接收状态
PHY_SetRxState(true);
第5步:设置无线通讯安全密码
NWK_SetSecurityKey((uint8_t *)"Security12345678");
第6步:设置无线通讯安全密码
NWK_OpenEndpoint(APP_ENDPOINT, appDataInd);
注意 2~6部分在相同的网络里是一样的。
数据发送很简单,调用下面的函数就可以了。
NWK_DataReq(&appDataReq);
不过在此之前,需要把准备发送的内容放入发送缓冲区,并配置好发送相关参数。
- appDataReq.dstAddr = 1 - APP_ADDR;
- appDataReq.dstEndpoint = APP_ENDPOINT;
- appDataReq.srcEndpoint = APP_ENDPOINT;
- appDataReq.options = NWK_OPT_ENABLE_SECURITY;
- appDataReq.data = appDataReqBuffer;
- appDataReq.size = appUartBufferPtr;
- appDataReq.confirm = appDataConf;
复制代码
数据接收也很简单,调用下面的函数。
static bool appDataInd(NWK_DataInd_t *ind)
不过这个函数需要自己实现。
- static bool appDataInd(NWK_DataInd_t *ind)
- {
- for (uint8_t i = 0; i < ind->size; i++)
复制代码
任务调度中会用到系统提供的软件定时器,当然,你也可以不用,自己安排调用。
软件定时器
SYS_TimerStart() – 启动一个软件定时器
SYS_TimerStop() – 停止一个软件定时器
SYS_TimerStarted() – 查询软件定时器是否启动
定时到会调用下面的处理程序。
static void appTimerHandler(SYS_Timer_t *timer)
具体内容需要自己实现,一般会把发送数据的函数放在里面。
- static void appTimerHandler(SYS_Timer_t *timer)
- {
- appSendData();
- (void)timer;
- }
复制代码
RF部分功率管理
NWK_Busy() 检查RF模块是否空闲,空闲时才方便进入睡眠。
NWK_SleepReq() RF模块进入睡眠请求。
NWK_WakeupReq()RF模块唤醒请求。
系统管理
SYS_Init()
SYS_TaskHandler()
用户任务
static void APP_TaskHandler(void)
应用程序框架
- <blockquote>int main(void)
复制代码
先写这么多,后面再修改吧。