首页资源分类嵌入式开发ARM MPU > 与Atmel D21/R21 相遇、相识、相知(下)——Atmel SAM R21 Xplained Pro 开发板实战演练

与Atmel D21/R21 相遇、相识、相知(下)——Atmel SAM R21 Xplained Pro 开发板实战演练

已有 456766个资源

相关资源

下载专区

文档信息举报收藏

标    签: AtmelD21R21

分    享:

文档简介

与Atmel D21/R21 相遇、相识、相知(下)——Atmel SAM R21 Xplained Pro 开发板实战演练

文档预览

Atmel SAM R21 Xplained Pro 实战演练 与 Atmel SAM D21/R21 的相遇、相识、相知 ( 下 ) ——Atmel SAM R21 Xplained Pro 实战演练 1 Atmel SAM R21 优势整合,精“芯”构造 序 Atmel SAM R21 Xplained Pro 实战演练 爱特梅尔在我的印象里是一家传奇的公司,在整个芯片产业周期里留下了很多传奇的经典产品。 AVR 目前仍然是 Atmel 八位单片机的主力, 一直都是一款全球很受欢迎的产品, 在很多的应用当 中(比如, 处理性能需求较低的电灯或门禁等) AVR 仍然是很好的选择。 爱特梅尔的其他优秀产品 ARM7 系列 AT91SAM7Sxx,ARM9 系列 AT91SAM9xx 都是相当经 典的产品,直到今天在控制领域仍占据一席之地。 近几年 ARM 推出的 Cortex-M 系列可以说足足让 MCU 的市场重新洗牌,越来越多的厂家投向 ARM 的怀抱,当然爱特梅尔也不落后 , 如今已经拥有 M0/M3/M4/M7 等多个产品线的新产品,继承爱 特梅尔以往 MCU 优秀的外设和经验,这些新品总是让人眼前一亮。 爱特梅尔除了这些优秀的 MCU/MPU 之外还有很多优秀的产品线,爱特梅尔是最早推出 IEEE802.15.4 无线芯片的厂商之一。伴随着 IEEE-802.15.4 标准的发展和更新依次出现过多个产品型号 AT86RF230/AT86RF231/AT86RF233 这些都是 2.4G 频段的无线芯片。目前最新的功能最完善的, 性能最佳的,经受市场考验的型号是 AT86RF233 之前那些可以说是过度产品,这是爱特梅尔一贯做 事的风格。 当然爱特梅尔也是全球第一家推出 700/800/900M 频段的 IEEE-802.15.4 无线芯片 AT86RF212, 号称可以传输 6 公里。 2009 年爱特梅尔收购 MeshNetics-ZigBee 知识产权,收购包括 BitCloud TM ZigBee PRO 软 件和 ZigBit TM 无线模块。通过此次收购,爱特梅尔现可为面向呈爆炸性增长的 ZigBee 无线市场的电 子设备制造商提供业界最全面的无线解决方案。 这次有幸成为 SAM-R21-Xplained-Pro 评估套件的试用者之一,主芯片 ATSAMR21G18A 是 一颗 SOC 解决方案,集成 SAMD21 和 AT86RF233。在如今物联网风生水起的年代,这种性能优越、 性价比高的 SOC 无线芯片肯定会被越来越多的工程师知道并设计到产品中。这种芯片定位市场很准确, 主要面向 SOC 的 ZigBee/6LowPAN 应用领域,ZigBee 这个自然有官方开发好的 ZigBit 协议栈。 如今微软都开始免费了,要不是这些年被 linux/android 的打击,估计也很难做到免费。从谷歌收 购 nest 后部署 threadgroup 来看未来很可能是 6LowPAN 一统天下。 爱特梅尔在无线传感网开源界耕耘多年,积累了很多优秀的资源和高校科研话题,比如 TinyOS/ Contiki 等基本上第一次都是被在爱特梅尔的 MCU+RADIO 的平台上实现。 考虑到如今 ARM 生态圈被更多的工程师接受,这款 SOC 芯片内置的 SAMD21 采用的是 ARM 公司 M0 内核。相信这颗无线 SOC 会被市场所接受,没有任何拒绝使用的理由,内置性能最优越的无 线芯片,采用 M0 内核生态圈完整,同时供应独立的无线收发器 AT86RF233 让设计更自由。 很幸运最近能试用 R21 的开发套件,目前已经能运行 contiki 了,关于移植的细节后面要好好的说说, 涉及的外设还是挺多的,基本上需要结合数据手册和官方的 drivers 下面的 quickstart 就能搞定了。 这次我选择的开发环境是 IAR 而并非官方的 AtmelStudio,原因只是因为这个项目有点复杂,还 是用自己熟悉的开发环境好一些。不过 AtmelStudio 还是相当不错的一款 IDE 了,可以说是后面的一 种趋势吧,基本上和开源界的 Eclipse 很像。当然不止是 IDE 了,还有集成的 AFS 开发框架,真的 很不错,里面包含的各种插件,开发者基本上不需要太关心如何去关联这些第三方的软件包。直接在 02 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 AtmelStudio 中使用可视化的方式就能够把这些软件包包含到自己的项目中。我认为这在将来一定是一 个趋势也是一种必然,当然了很有可能是 arm 的 mbed 或者是 atmel 的 arduino 触发的一种新的开发 趋势。 说完 IDE 继续说 AFS 软件构架包,这是一个好东西,可以说是必不可少的开发利器,基本上支持 atmel 全系列的 mcu 产品和 demo 板子。说到板子还想提一下板子上自带的 CMSIS-DAP 的调试器 可以说也是未来的一个趋势,在老外眼里没有什么山寨的 jlink/ulink,这些对他们来说是很奢侈的。当 然 IAR/MDK 这些都是一样的,渐渐的中国这几年也会有这种保护知识产权的趋势,这种板载的调试器 可以说以后是必不可少的东西。基本上现在所有的官方的评估板都有这种支持。 继续说 afs,最好还是打开它的目录看一下,东西有点多,根目录下有针对不同 mcu 的目录基本上 是和外设相关的,还有两个 common 的目录里面都是一些通用的东西,比如延时函数,stdio,一些相 关的服务等。 重点看一下 thirdpart,这玩意很多厂家都有的最早接触的是 ti 的开发包中的,印象比较深刻的是有 freertos,这也会是一个趋势,更多的人会去使用这种开源的 os 而不仅仅局限于 ucos 这种。 我想把 ATSAMR21G18A 介绍给您,可惜文字有限,还是让 EE 的网友一同带你领略一下它的魅 力吧。 Atmel R21 无线 DIY 设计大赛一等奖获得者 lyzhangxiang 03 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 目录 序.......................................................................................................................................02 第一章 初识,Atmel SAM R21开发板简介.............................................................06 1.1 综述......................................................................................................................................................06 1.2 Atmel SAM R21 Xplained硬件分析...........................................................................................09 第二章 牛刀小试 Atmel SAM R21 Xplained例程与测试.....................................20 2.1 Atmel SAM R21 Xplained基础例程演示....................................................................................20 2.2 Atmel SAM R21 Xplained 串口透传测试..................................................................................24 2.3 Atmel SAM R21 Xplained WSNdemo的测试.........................................................................25 2.4 Atmel SAM R21 Xplained 比较器测试.......................................................................................34 2.5 Atmel SAM R21 Xplained ADC的使用......................................................................................37 第三章 实战演练 基于Atmel SAM R21 Xplained的DIY设计..............................39 3.1 基于zigbee的ZLL灯光控制系统.....................................................................................................39 3.1.1 设计综述....................................................................................................................................39 3.1.2 设计详解之Peer2Peer项目添加OLED显示功能................................................................41 3.1.3 设计详解之OLED显示无线接收到数据...............................................................................45 3.1.4 设计详解之Peer2Peer项目添加SERCOM (i2c)TWI .......................................................48 3.1.5 设计详解之跑ZLLDemo .......................................................................................................52 3.1.6 设计详解之(ZLLDEMO+SLRemote)步步入门..................................................................55 3.1.7 设计详解之解决ZLLDEMO例程中UART发送而LED0没输出问题 ................................ 58 3.1.8 设计详解之ZLLDEMO+(colorSceneRemote)场景遥控器硬件搭建...................... 61 3.1.9 设计详解之场景遥控增加OLED功能程序..........................................................................63 3.2基于Atmel SAM R21 Xplained的超市手写价格标签................................................................66 3.2.1 综述............................................................................................................................................66 3.2.2 设计详解之闪起那骚亮的小黄灯..........................................................................................71 3.2.3 设计详解之SERCOM!SERCOM!....................................................................................75 3.2.4 设计详解之 使用SPI驱动微雪LCD........................................................................................79 3.2.5 设计详解之时钟、SPI和触摸.................................................................................................85 3.2.6 设计详解之简单了解ZigBee................................................................................................90 3.2.7 设计详解之LWMESH-WSNDEMO应用实验....................................................................94 04 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.2.8 设计详解之LWMESH手写的优化.........................................................................................99 3.2.9 设计详解之超市手写标签毛胚功能货 ...............................................................................101 3.3 基于Atmel SAM R21 Xplained的家庭鱼缸和植物看护系统 ...............................................104 3.4 基于Atmel SAM R21 Xplained的自行车伴侣.........................................................................115 3.5 基于SAM R21的6LoWPAN低功耗网络平台研究 ...................................................................127 3.5.1 综述..........................................................................................................................................127 3.5.2 设计详解之 初步接触............................................................................................................142 3.5.3 设计详解之Contiki-OS移植篇............................................................................................144 3.5.4 设计详解之6lowpan网络单播/多播测试..........................................................................152 3.5.5 设计详解之边界路由器RPL-BORDER-ROUTER.............................................................156 3.5.6 设计详解之RPL Simple-WebServer................................................................................159 3.5.7 设计详解之openwrt网关准备............................................................................................162 3.5.8 设计详解之添加GPU.............................................................................................................167 3.5.9 设计详解之GPU运行.............................................................................................................172 3.5.10 设计详解之 6LoWPAN之应用层CoAP协议..................................................................180 3.5.11 小结 基于SAM R21的6LoWPAN低功耗网络平台研究...............................................188 附录一 关于Atmel SAM R21 Xplained的相关资源............................................ 196 附录二 鸣谢及版权声明.............................................................................................. 197 05 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 第一章 初识,Atmel SAM R21 开发 板简介 1.1 综述 Atmel SAMR21Xplained pro 是 ATSAMR21G18A 芯片的评估板,主要是用来让开发者了解这 块芯片的。ATMEL SAM R21 系列是基于 32bit ARM Cortex-M0,内部集成了 IEEE802.15.4 物理层、 2.4GHz 射频收发器的无线低功耗处理器系列产品,能够满足用户一些基于 ZigBee 的应用。 图 2-2 :ATMEL SAMR21 封装 06 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 图 2-2-1 :ATMEL SAMR21 命名规则 芯片的具体性能如下: 高性能 ● 48MHz operation ● 2.14 CoreMark/MHz ● Single-cycle IO access ● 12-channel event system ● 12-channel DMA 低功耗 ● < 70μA/MHz ● <3.5μA RAM retention and RTC ● Internal andexternal oscillators ● On-the-fly clockswitching and prescaling Robust peripheral set ● Ultra-low power 2.4GHZ transceiver ● Up to five serial communication modules (SERCOM)configurable as UART/USART, SPI or I2C ● Up to three 16-bitTimer/Counters ● Peripheral Touch Controller that supports buttons,sliders, wheels and proximity with up to 48 channels ● Real Time Clock (RTC) and Calendar with leap yearcorrection and 1ppm calibration ● 12-bit 300kbps ADC ● Full Speed USBdevice and host 07 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 World-class tools ● SAM R21 Xplained Pro starter kits – $39 ● Atmel Studio withcompiler support – Free ● Atmel Software Framework – Fre e ● Low-level drivers and stacks – Free 评估板上资源如下: 图 2-3 :ATMEL SAMR21 Xplained Pro 资源 一个用户按键,一个复位按键,以及一个用户 LED,一个调试用的 USB,以及一个 OTGUSB 接 口。板子上带了一个天线,和一个 SMA 接口的天线接口,用户可以根据实际需要,是选择贴片天线和 SMA 端子的杆状天线。这个设计还是蛮贴心的。 板子预留两个扩展接口,用户可以根据需要插上一些板卡,进行研究。 还是想在说一句,除了有点小贵,板子做工真的很精致。 详情请查看:http://bbs.eeworld.com.cn/thread-457989-1-1.html 08 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 1.2 Atmel SAM R21 Xplained 硬件分析 很早就想写这一篇硬件分析,因为软件部分大家写的比较多,硬件部分就很少了。只是一直没有时间, 再就是也没有想好怎样写。今天先开个头,后面在慢慢补充。 整体结构 SAM R21 Xpalined Pro 开发板和其他 xplained 系列开发板差不多,都是板载 EDBG 仿真器 + MCU 的结构。整个开发板没有太多的冗余,除了仿真器电路和 RF 电路,没有额外的电路,只有 xplained 专用的扩展插座,可以连接 Xplained 专用的扩展板。 系统电源 先看看系统电源部分。SAM R21 Xplained pro 开发板支持多种供电方式: ● 仿真器 USB 供电 ● SAM R21 的 USB 接口供电 ● 外部供电 电 源 管 理 是 通 过 U101、Q100、Q101、Q102 等 完 成。 其 中 U101 是 TPS2112, 它 具 有 双 路输入 / 单路输出自动切换功率多路复用器,具有自动 切换、可调节 电流限制、可调节 电压阈值和 切换状态等功能。这里 U101 实现两路 USB 电源的切换和限流,限流大小为 250/390=641mA。 这几路电源中,外部电源优先级最高,SAM R21 的 USB 最低。当有外部电源输入时,Q101、Q102 导通, 同时 U101 的 EN 为高,使 U101 的 OUT 被禁止。当没有外部电源时,如果 EDBG 的 USB 电源有输入, 将优先使用 EDBG 的 USB 电源。只有再其他电源都没有时,SAM R21 的 USB 电源才生效(即使它 的电压比其他高也不行)。 09 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 这三路电源,最终通过上面的电路汇集到 VCC_P5V0,然后送到 U100(SPX3819R2)这个 500mA 的 LDO 上,输出 3.3V 给 SAM R21 和扩展板供电。这个 3.3V 同时也送到 J100 和 J200(EXT1)、 J202(EXT3)上,给外部模块供电。此外 3.3V 通过 R109、R110 分压后送到 EDBG 的 ADC0 上, 进行电压检测。 SAM R21 Xplained 还设置了 J101 这个跳线,方便做电流检测。平时 J101 通过短路块连接,需 要测试电流时将它取下,串联电流表就可以测试了。 时钟 SAM R21 Xplained 开发板的时钟有两个:16MHz 主时钟和 32K RTC 时钟。它们都是普通无源 晶体。 晶体的 XOUT 旁有一个小焊盘,可以断开并串入一个电阻,用于测试晶体频率。 10 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 接着前面的。 仿真器 仿真器的 USB 部分电路如下: 数据线 D+/D- 上连接有 ESD 保护器件 PRTR5V0U2X,可以有效的防止干扰信号对仿真器 MCU 的影响。 电源部分使用了 LC 滤波,也可以有效的防止浪涌干扰。滤波后的电源是 VCC_EDBG_USB_ P5V0,它会送到前面分析过的 U101-IN1 中,作为我们调试时的电源。 仿真器和 SAM R21 之间有多种接口。其中 SWD 是通过 0 欧姆电阻直接相连,没有做电平转换。 11 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 下图中,上面是 EDBG 部分,下面是 SAM R21 部分。 除了 SWD 歪,仿真器和 SAM R21 之间还有很多接口。 串口,可以通过计算机上仿真器的 USB 虚拟串口直接和 SAM R21 通信。 SPI 接口 四个 GPIO 和 I2C 接口 12 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 看到上面众多的接口,可以想象以后可以通过 EDBG 实现 USB 转 I2C/SPI/GPIO/UART 等许多 功能。不过需要注意,这些接口都是 EDBG 和 SAM R21 直接连接,部分输入上有限流电阻,还有部 分接口上串有 0 欧姆电阻,方便断开。 仿真器上还有一路电压采集信号,它通过 ADC0 采集系统 3.3V 的电压。 前面都是仿真器和 MCU 之间的接口,仿真器自己还有一个 JTAG 口,不过这个接口没有直接引出 来,而是连到反面 PCB 上的焊盘,它应该是通过专用的设备进行访问了。 接口 SAM R21 Xplained 开发板上有众多的接口,我们一个个来看看。 USB 13 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 SAM R21 原生支持 USB 接口,它的 PA24/PA25 就是 USB 的 D-/D+。在 D+/D- 上接有 D300 ESD 保护(PRTR5V0U2X),可以有效保护 USB 数据接口,这也是标准用法。注意 USB 的外壳是 通过两个没有安装的电阻电容接地的,所以测试时不要将它做为地线了。 CORTEX Debug 可能是为了兼容更多的开发工具,除了板载仿真器 EDBG 的 SWD 仿真调试口外,SAM R21 Xplained 留出有一个外部的 Cortex Debug 接口,可以连接外部的仿真器。这样用户可以根据自己的 情况使用功能更强的仿真器。 为了使用外部的仿真器,需要安装 J303,它是一个标准的 JTAG 接口,使用 1.27mm 间距的 5x2 排针,只支持 SWD 模式。同时避免和板载的 EDBG 冲突,需要将 R322、R323、R324 这几个电阻取下。 14 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 扩展板接口(EXT1/EXT3) Xplained 系列开发板有一个特色就是支持统一风格的扩展口,可以连接不同的扩展板。SAM R21 Xplained 支持 EXT1 和 EXT3 两个扩展口(有的开发板支持 4 个甚至更多扩展口)。 15 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 ATMEL 对 EXT 扩展接口有一个统一的定义,如上图所示。下图可能更加直观。 PIN1 是 ID,就是 ATMEL 自己加密芯片用的单线接口,识别开发板和扩展板。在开发板连接到 PC 时可以被 AS6 自动识别出来,就是使用这个 ID 功能。 PIN3/4 是两路 ADC 的输入。 PIN5/6 是两个 GPIO。 PIN7/8 是两路 PWM 输出。 16 Atmel SAM R21 优势整合,精“芯”构造 PIN9 是中断输入 PIN10/15 是两个 SPI 的片选信号 PIN11/12 是 I2C PIN13/14 是 UART 的 RX/TX PIN16/17/18 是 SPI 的 MOSI/MISO/SCK PIN19/20 是 GND/VCC Atmel SAM R21 Xplained Pro 实战演练 虽然 EXT 接口的定义是一致的,但是不代表扩展板就可以任意接。因为每种 Xplained 开发板的资 源、IO 不同,连接到每个 EXT 口上的 IO 不一定一样,具体需要看开发板的原理图和程序中的定义了。 其它 前面分析了主要的硬件模块,我们在分析剩下的一些地方。 按键和 LED SAM R21 Xplained 开发板带有一个用户按键和一个用户 LED。PA19 通过 R303 连到 LED,再 通过 R303 这个 330 欧电阻连接到 Vcc;PA28 通过 R306 和 R302 连接按键。 R301 和 R306 有什么作用呢?因为 PA19 和 PA28 也连接到扩展口 EXT1,在需要时可以断开 R301 和 R306,防止 LED 和按键对 EXT1 尝试冲突。 R302 这个 39 欧电阻起到什么作用?为什么在按键上要串这个电阻。还是因为扩展口 EXT1,如 果 EXT1 输出高而按键被按下,R302 就可以保护 EXT1 上的输出信号。 I2C 板载的 I2C 没有太多好说的,标准用法,上拉 4.7K 的电阻到 Vcc。当 I2C 上连接的芯片 17 Atmel SAM R21 优势整合,精“芯”构造 较多时,可以适当减小这个电阻。 Atmel SAM R21 Xplained Pro 实战演练 复位电路 EDBG 或者复位键都可以使 SAM R21 的复位。SAM R21 的 RESET 信号默认通过 R300 上拉到 VCC,C301 可以防止干扰信号影响 RESET。 如果 EDBG 通过 R331 连接到 SAM R21 的 RESET,复位键是通过 R304 连接到 RESET。这两个 39 欧电阻可以起到保护作用,和上面 R302 的作用相同。 电源 SAM R21 Xplained Pro 的电源设计的很规范,每个 VCC、VDDCORE、VDDIO、AVDD、 AVDOUT 上都有 100nF 的退耦电容。 VCC 通过 L300 和 C306、C301 这个 LC 电路连接到 AVDD,可以防止 VCC 上的数字噪声影响 模拟电源。 18 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 RF RF 部分也是 SAM R21 这个开发板的重点,可惜参考资料比较少,可能 ATMEL 希望大家多买模块。 开发板有两个天线:板载陶瓷天线 A600 和外接 SAM 天线 J600。J600 可以自己连接一个 2.4G 的 鞭状天线,增强 RF 信号。不过板载陶瓷天线效果也很不错,一般情况下足够用了。和有的开发板是 使用电阻选择天线不同,SAM R21 上的两个天线是通过射频开关 U600 切换的。U600 是 AS22292LF,它的最高频率是 3G,最大损耗 0.5dB。U600 通过 POSWITCH_P 和 POSWITCH_N 控制。 B600 是 AT86RF232 和 AT86RF233 专用的巴伦滤波器 2450BM15A0015E。 它的数据手册在:http://www.mouser.com/ds/2/611/2450BM15A0015-242316.pdf。 J304 J304 上 连 接 有 三 个 IO:PA09、PA12、PA27。 这 是 三 个 在 其 它 地 方 没 有 用 到 的 引 脚。 详情请查看: http://bbs.eeworld.com.cn/thread-454428-1-1.html http://bbs.eeworld.com.cn/thread-454482-1-1.html http://bbs.eeworld.com.cn/thread-454561-1-1.html http://bbs.eeworld.com.cn/thread-455331-1-1.html 19 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 第二章 牛刀小试 Atmel SAM R21 Xplained 例程与测试 2.1 Atmel SAM R21 Xplained 基础例程演示 通过 macroUSB 连接上电后,和其它 ATMEL 的开发板一样,可以自动在 ATMEL Studio 6 中识 别出来。 这个开发板好像没有带有默认的例程,上电后没有任何变化,所以就直接试了试 ASF 中的例程。 我选择了最新的 ASF 3.20.1 版的 ASF,并选择了第一个例程,DELAY Example。 20 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 例程很简单,就是使用三种不同的方式进行 delay:delay_s、delay_ms、delay_cycles。看名 称就应该知道功能了。 编译好例程后,就可以下载到 SAM R21 了。下载前,需要先选择一下 debugger/programmer。 感觉这个地方,软件可以做的更人性化一些,不要每次都自己去设置一下,因为自家的开发板上肯定是 EDBG 仿真器了。 21 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 下载前,出现了 EDBG 升级的提示。因为我将软件升级到了 6.2sp1,所以带有的固件也升级了。 升级好 EDBG 的固件,就可以用 Device Programmer 将程序下载到开发板运行,也可以仿真运行。 我先使用 Device Programmer 下载,下载前还要选择一下下载接口,而仿真时没有这个提示的。 22 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 选择后,就可以到左边选择 memories,然后按下 Program,程序就可以开始下载并运行了。 需要注意第三种延时 delay_cycles 非常快,delay_cycles(100) 时眼睛也无法分辨出来。可以将 延时 5000 次减少到 50 次,延时次数 100 增加到 500000,这样就可以看出效果了。 详情请点击:http://bbs.eeworld.com.cn/thread-452891-1-1.html 23 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 2.2 Atmel SAM R21 Xplained 串口透传测试 折腾了一个晚上,终于将 SAM R21 的透传实验做成功了。一开始程序下载很正常,就是串口通信 有问题,收不到数据。后来发现原来是串口软件需要设置 DTR 信号才能正常通信。 下面分享一下具体的步骤: 首先打开 ATMEL Atudio,接上开发板,选择 LWMesh Peer2Peer 例程 选择合适位置后,创建例程 打开文件 config.h,将 49 行的 APP_ADDR 设置为 0,然后编译程序并下载到 R21-1 将 APP_ADDR 设 置 为 1, 在 编 译 下 载 程 序 到 R21-2。 地 址 必 须 从 0 开 始 设 置, 依 次 设 置 1234,不过只有两块板,不能测试更多情况。下载程序时,如果两个开发板连到同一个计算机上,注 意要区分一下不同的 EDBG。 如果使用串口助手这样的软件,需要将 DTR 选中。 24 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 2.3 Atmel SAM R21 Xplained WSNdemo 的测试 从昨天折腾到今天,终于将 WSNDemo 测试成功。 从 ASF 中创建例程的步骤就不重复了。创建好 LWMesh-WSNDemo-Application 例程后,我们 可以在项目管理器中看到还带有 pdf 应用笔记和 WSNmonitor 监视软件。AS6 将这么多东西都打包进 去了,难怪速度比较慢。 在 config.h 中,我们可以看到下面的定义 #if APP_ADDR == 0x0000 #define APP_CAPTION "Coordinator" #define APP_NODE_TYPE 0 #define APP_COORDINATOR 1 #define APP_ROUTER 0 #define APP_ENDDEVICE 0 25 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 #elif APP_ADDR < 0x8000 #define APP_CAPTION "Router" #define APP_NODE_TYPE 1 #define APP_COORDINATOR 0 #define APP_ROUTER 1 #define APP_ENDDEVICE 0 #else #define APP_CAPTION "End Device" #define APP_NODE_TYPE 2 #define APP_COORDINATOR 0 #define APP_ROUTER 0 #define APP_ENDDEVICE 1 #endif APP_ADDR 是 0,就是 Coordinator,小于 0x8000 是 Router,否则才是 End Device。因为只 有两个 SAM R21,所以只能一个设置成 End Device,另一个设置为 Coordinator。分别设置 APP_ ADDR 为 0 和大于 0x8000(这里设置为 0x9012 了),编译并分别下载到两个 SAM R21 中。下载 后立刻就可以看到,随着 End Device 每两秒发一次数据(LED 闪一次),Coordinator 上的 LED 也 同步闪一次,说明它们的之间无线通信已经连上。 再安装 WSNMonitor,这是一个 Java 程序。 26 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 使用这个软件前,需要进行参数设置。这里很关键,我就是在这里卡了一天才发现问题。点击 File 菜单下的 Connect 或者直接点工具栏上的第一个按钮,就进行参数设置。 首先要指定 Protocol 目录,我们需要将它指定到 WsnMonitor 软件下的 protocol 目录。如果我们 通过编辑栏右边的按钮去指定,会遇到一个坑,它会自动在目录名的最后添加 .null,需要手工将它删除 才行。 然后在选择串口和设置串口参数。波特率要设置为 38400,因为单片机是这样设置的。此外流控也 必须设置,这是第二个坑,选择 xon/xoff 或者 hardware 都可以,就是不能选择 none。 选择好后点击 ok 就开始联机了。如果没有错误,就可以看到下面的画面。如果没有看到,就说明 你的设置错了,请在检查一下。 27 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 当然我们也可以用其它串口软件,用 HEX 方式截取数据。可以看到数据包中 12 90 就是刚才设置 的 End device 地址。 APP_ADDR 是 0,就是 Coordinator,小于 0x8000 是 Router,否则才是 End Device。因为只 有两个 SAM R21,所以只能一个设置成 End Device,另一个设置为 Coordinator。分别设置 APP_ ADDR 为 0 和大于 0x8000(这里设置为 0x9012 了),编译并分别下载到两个 SAM R21 中。下载 后立刻就可以看到,随着 End Device 每两秒发一次数据(LED 闪一次),Coordinator 上的 LED 也 同步闪一次,说明它们的之间无线通信已经连上。 再安装 WSNMonitor,这是一个 Java 程序。 28 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 使用这个软件前,需要进行参数设置。这里很关键,我就是在这里卡了一天才发现问题。点击 File 菜单下的 Connect 或者直接点工具栏上的第一个按钮,就进行参数设置。 首先要指定 Protocol 目录,我们需要将它指定到 WsnMonitor 软件下的 protocol 目录。如果我们通过 编辑栏右边的按钮去指定,会遇到一个坑,它会自动在目录名的最后添加 .null,需要手工将它删除才行。 29 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 然后在选择串口和设置串口参数。波特率要设置为 38400,因为单片机是这样设置的。此外流控也 必须设置,这是第二个坑,选择 xon/xoff 或者 hardware 都可以,就是不能选择 none。 选择好后点击 ok 就开始联机了。如果没有错误,就可以看到下面的画面。如果没有看到,就说明 你的设置错了,请在检查一下。 当然我们也可以用其它串口软件,用 HEX 方式截取数据。可以看到数据包中 12 90 就是刚才设置 的 End device 地址。 30 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 31 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 如果是超级终端、Kitty、SecureCRT 这样的软件,直接设置波特率 9600 就行。 32 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 然后就可以发数据了。发送时,SAM R21 除了会通过无线发送外,还会往本机串口回送 详情请见:http://bbs.eeworld.com.cn/thread-452982-1-1.html 33 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 2.4 Atmel SAM R21 Xplained 比较器测试 昨天又试了试 SAM R21 的比较器和 ADC 功能,先说说比较器的使用。 从数据手册中我们看到比较器使用了 PA04-PA07 这几个脚,而 ADC 使用了 PA04-PA09。 ASF 中比较器的例程中,我们看到主要设置是在 configure_ac_channel 函数中。 void configure_ac_channel(void) //! [setup_7] { /* Create a new configuration structure for the Analog Comparator channel * settings and fill with the default module channel settings. */ //! [setup_8] struct ac_chan_config ac_chan_conf; //! [setup_8] //! [setup_9] ac_chan_get_config_defaults(&ac_chan_conf); //! [setup_9] 34 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 /* Set the Analog Comparator channel configuration settings */ //! [setup_10] ac_chan_conf.sample_mode = AC_CHAN_MODE_SINGLE_SHOT; ac_chan_conf.positive_input = AC_CHAN_POS_MUX_PIN0; ac_chan_conf.negative_input = AC_CHAN_NEG_MUX_SCALED_VCC; ac_chan_conf.vcc_scale_factor = 32; //! [setup_10] /* Set up a pin as an AC channel input */ //! [setup_11] struct system_pinmux_config ac0_pin_conf; system_pinmux_get_config_defaults(&ac0_pin_conf); ac0_pin_conf.direction = SYSTEM_PINMUX_PIN_DIR_INPUT; ac0_pin_conf.mux_position = MUX_PA04B_AC_AIN0; system_pinmux_pin_set_config(PIN_PA04B_AC_AIN0, &ac0_pin_conf); //! [setup_11] /* Initialize and enable the Analog Comparator channel with the user * settings */ //! [setup_12] ac_chan_set_config(&ac_instance, AC_COMPARATOR_CHANNEL, &ac_chan_conf); //! [setup_12] //! [setup_13] ac_chan_enable(&ac_instance, AC_COMPARATOR_CHANNEL); //! [setup_13] } //! [setup] 它是使用了 AIN0 作为比较器的正输入,对应 PA04,因此做比较器实验时,我们将比较器的 输入接到 EXT1 接口上的 PA04。比较器的负端使用 VCC 的分压做输入,分压系数是 32,也就是 32/64=1/2Vcc。如果修改分压系数,可以得到不同的比较门限,如果改变比较器的输入,可以使用不 同的 GPIO。 35 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 LED0 代表了比较器的输出,可以通过调节电位器方便的观察比较器的输出状态。 详情请见:http://bbs.eeworld.com.cn/thread-453044-1-1.html 36 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 2.5 Atmel SAM R21 Xplained ADC 的使用 从数据手册中,我们可以看到 SAM R21 的 ADC 具有如下特性: 8 路外部输入 350Kbps 采样率 8/10/12 位分辨率 支持过采样 可以设置采样平均次数(数字滤波) 内部 1V、AVCC/2、AVCC/1.48、两路外部基准输入 支持单端和差分输入 可以设置增益,带有自动补偿功能 支持窗口模式 可以采集内部温度传感器和基准功能很强啊,因此 ADC 的使用比 AC(比较器)要复杂一点。在 Quick start ADC 中,ADC 的初始化部分如下: //! [setup_modify_conf] config_adc.gain_factor = ADC_GAIN_FACTOR_DIV2; config_adc.clock_prescaler = ADC_CLOCK_PRESCALER_DIV8; config_adc.reference = ADC_REFERENCE_INTVCC1; config_adc.positive_input = ADC_POSITIVE_INPUT_PIN6; config_adc.resolution = ADC_RESOLUTION_12BIT; //! [setup_modify_conf] //! [setup_set_config] adc_init(&adc_instance, ADC, &config_adc); //! [setup_set_config] 它使用内部 1V 基准,因此外部输入电压不要超过 1V。使用单端模式,PA06 作为输入,12 位分辨率。 37 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 ASF 中的 Qucik Start ADC 的例程太简洁了,只读取了一次 ADC 后就进行入 while(1) 死循环, 不方便我们做测试,因此我又通过 ASF 增加了 delay 和 usart 模块,周期读取 ADC 并通过串口将数 据发到 PC,这样就可以通过调节电位器方便的测试 ADC 了。 详情请查看:http://bbs.eeworld.com.cn/thread-453049-1-1.html 38 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 第三章 实战演练 基于 Atmel SAM R21 Xplained 的 DIY 设计 3.1 基于 zigbee 的 ZLL 灯光控制系统 3.1.1 设计综述 本次活动的主芯片 ATSAMR21G18A,ATSAMR21G18A=ARM Cortex-M0+ ”+“2.4GHz 射 频收发器 AT86RF233。通过 ATMEL 的 BitCloud 下的各种无线协议实现 ZigBee Light Link (ZLL) 实 现家庭中的灯光的组网控制开,关,亮度调节功能! 一、系统架构 直接采用 atmel 公司主推的 BitCloud,通过它学习配置工程,结合硬件移植,底层驱动。通过 zigbee 标准 ZLL 协议能够组网不同的硬件。 二、zigbeeLight Link 软件组成 针对本活动硬件,直接修改用户应用层即可。 三、效果演示 39 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 Zll 单元灯,采用 zigbee 的 Router type,场景控制器采用 End device type 视频操作说明: 1:上电,复位 2:按 场景控制器的 sw0,恢复无线组网参数。 3:按 场景控制器的 五方向杆中间建,扫描周边网络,找到到既等待加入,加入后,目标灯会闪烁, 表示组网成功! 4: 按 场景控制器的 五方向杆 左,右建,亮度调节 5; 按 场景控制器的 五方向杆 上,下建 开,关灯控制 手机自动调亮功能 , 视频中不容易分辨亮度调节 , 追加一段看看 ! 详情请查看:http://bbs.eeworld.com.cn/thread-458610-1-1.html 40 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.1.2 设计详解之 Peer2Peer 项目添加 OLED 显示功能 在原本项目的工程下,对接收到的数据显示在 OLED 上,为下部添加其他人机界面做准备 一、添加文件夹 common2 下 文件夹见图片 二、添加 字模库 及  OLED 地层驱动 字库来自其他工程,底层驱动来自 SSD1306 example 41 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 然后自己添加 显示字符的函数 /** * \brief Display text on OLED screen. * \param string String to display. */ void ssd1306_write_text(const char *string) { uint8_t *char_ptr; uint8_t i; while (*string != 0) { if (*string < 0x7F) //127 { char_ptr = font_table[*string - 32]; for (i = 1; i <= char_ptr[0]; i++) { ssd1306_write_data(char_ptr); } ssd1306_write_data(0x00); } string++; } } 42 Atmel SAM R21 优势整合,精“芯”构造 三、设置 OLED 文件 路径 Atmel SAM R21 Xplained Pro 实战演练 四、在 Peer2Peer.c 添加包含头文件 五、显示 43 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 详情请查看:http://bbs.eeworld.com.cn/thread-453051-1-1.html 44 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.1.3 设计详解之 OLED 显示无线接收到数据 把接收到的数据显示在 OLED 上,同时显示 rssi, 及数据长度 一、添加全局变量 char disp[32]; uint8_t rssi; uint8_t recv_ok; uint8_t recv_lenght; 二、在无线接收回调函数中添加标志,及缓存 static bool appDataInd(NWK_DataInd_t *ind) { rssi=ind->rssi; recv_lenght= ind->size; for (uint8_t i = 0; i < ind->size; i++) { sio2host_putchar(ind->data); disp=ind->data; } LED_Toggle(LED0); recv_ok=1; return true; /* if (!appReadyToReceive) return false; 45 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 // process ind->size bytes of the data pointed by ind->data NWK_SetAckControl(APP_DO_NOT_SLEEP); return true; */ } 三、应用中显示到 OLED 上 static void APP_TaskHandler(void) 中添加 if(recv_ok==1) { recv_ok=0; ssd1306_clear(); // 页 ssd1306_set_page_address(0); // 列 ssd1306_set_column_address(0); sprintf(value_disp, "rssi=%d", rssi); ssd1306_write_text(value_disp); // 列 ssd1306_set_column_address(45); sprintf(value_disp, "size=%d", recv_lenght); ssd1306_write_text(value_disp); // 页 ssd1306_set_page_address(2); // 列 ssd1306_set_column_address(0); ssd1306_write_text(&disp); for(i=0;i APP_DEVICE_TYPE_ON_OFF_LIGHT LEDS_SET_BRIGHTNESS(levelControlClusterServerAttributes.currentLevel.value); #else LEDS_SET_BRIGHTNESS(255); #endif } else { //halOffFirstLed(); LEDS_SET_BRIGHTNESS(0); } 三、为什么开启了 PWM 功能,输出没有呢! LEDS_SET_BRIGHTNESS(255);===“BSP_SetLedBrightnessLevel(level)” 宏定义 leds.c 文件中对输出控制 /**************************************************************************//** \brief Set brightness level \param[in] level - new brightness level ******************************************************************************/ void BSP_SetLedBrightnessLevel(uint8_t level) { #if defined(APP_USE_PWM) 头文件里定义了采用 PWM 方式输出 58 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 currentL = level; ledsSetColor();// 对于当前的 X,Y 和 L 值设定的 PWM 值 #else if (level) BSP_OnLed(LED_FIRST); else BSP_OffLed(LED_FIRST); #endif /* APP_USE_PWM */ (void)level; } #if defined(APP_USE_PWM) -----------------------------------------------------------/**************************************************************************//** \brief Set PWM values for current X, Y and L values ******************************************************************************/ #if defined(APP_USE_PWM) static void ledsSetColor(void) { #ifdef APP_USE_PWM int maxL; unsigned int r, g, b; maxL_FromXY(currentX, currentY, &maxL); XYL2RGB(currentX, currentY, currentL, maxL, &r, &g, &b); r = r * TOP / 65535; g = g * TOP / 65535; b = b * TOP / 65535; bspSetPwmChannelCompareValue(r, g, b);//PWM_CHANNEL_0,PWM_CHANNEL_1,PWM_CHANNEL_2 #endif } -----------------------------------------------------------------------------------------------------------------------#if defined(APP_USE_PWM) /**************************************************************************//** \brief Set compare value for PWM channels \param[in] ch1, ch2, ch3 - compare value ******************************************************************************/ void bspSetPwmChannelCompareValue(uint16_t r, uint16_t g, uint16_t b) { // 既然要 PWM 输出功能为何不开启该通道输出呢,那就我们自己加好了 ! // 增加不同的板子判断 PWM 输出 //21——XPRO 没有输出 #if BSP_SUPPORT == BOARD_SAMR21_XPRO pwmChannel0.channelMask = (1 << PWM_CHANNEL_3);//PA19 HAL_SetPwmCompareValue(&pwmChannel0, b); #else pwmChannel0.channelMask = (1 << PWM_CHANNEL_2); HAL_SetPwmCompareValue(&pwmChannel0, b); pwmChannel0.channelMask = (1 << PWM_CHANNEL_1); HAL_SetPwmCompareValue(&pwmChannel0, g); pwmChannel0.channelMask = (1 << PWM_CHANNEL_0); 59 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 HAL_SetPwmCompareValue(&pwmChannel0, r); #endif } #endif 总之只要 ON/OFF 功能就把 #define APP_USE_PWM 注释掉 如果还要 PWM 功能那就要按上面部分修改下! 详情请查看:http://bbs.eeworld.com.cn/thread-454853-1-1.html 60 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.1.8 设计详解之 ZLLDEMO+(colorSceneRemote)场景遥控器硬件搭建 基本硬件 1. SAMR21 XPLAINED pro 板 2. OLED 显示硬件 占用 IO 资源 DATA_CMD_SEL,DISPLAY_SS ,DISPLAY_RESET 采用通用 IO 软件控制 SPI_MOSI,SPI_SCK 采用 SERCOM5 的 SPI 模式 3. joystick 6 个方向操作杆 通过 PA06 脚的 ADC 功能,通过不同方向的切换采样不同的电压值做,键值的判断 61 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 详情请查看:http://bbs.eeworld.com.cn/thread-455054-1-1.html 62 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.1.9 设计详解之场景遥控增加 OLED 功能程序 一、硬件连接 OLED1 XPLAINED PRO 板与 SAMR21 XPLAINED PRO 的 EXT1 接口对接 配置头文件中选择: #define BSP_SUPPORT BOARD_SAMR21_ZLLEK 二、管脚端口 #define LCD_SPI_CS_CONFIG PORT_B, 3u, 3u #define LCD_CMDSEL_CONFIG PORT_A, 13u, 3u #define LCD_RESET_CONFIG PORT_A, 23u, 3u 三、OLED 初始化 /**************************************************************************//** \brief Initialize the LCD ******************************************************************************/ void BSP_LcdInit(void) {   PinConfig_t lcdResetPin = {LCD_RESET_CONFIG};//A23   PinConfig_t lcdCmdSelPin = {LCD_CMDSEL_CONFIG};//A13 PinConfig_t lcdSpiCSPin = {LCD_SPI_CS_CONFIG};//B03  WCJ   /* Initialize LCD Pins Other than SPI connected Pins */   GPIO_make_out(&lcdResetPin);   GPIO_make_out(&lcdCmdSelPin);   GPIO_make_out(&lcdSpiCSPin); //WCJ   /* Initialize SPI Interface */   lcdSpiDescriptor.tty    = SPI_CHANNEL_1;// wcj   lcdSpiDescriptor.baudRate  = SPI_CLOCK_RATE_1000;   lcdSpiDescriptor.clockMode = SPI_CLOCK_MODE0;   lcdSpiDescriptor.dataOrder = SPI_DATA_MSB_FIRST;   lcdSpiDescriptor.callback  = NULL;   if (-1 == HAL_OpenSpi(&lcdSpiDescriptor))// 调用 BSP_BoardSpecificSpiPinInit(SpiCh annel_t tty)   { return;   }   GPIO_clr(&lcdResetPin);   GPIO_set(&lcdResetPin);   GPIO_clr(&lcdResetPin); GPIO_clr(&lcdCmdSelPin); GPIO_set(&lcdCmdSelPin); GPIO_clr(&lcdCmdSelPin); GPIO_clr(&lcdSpiCSPin); GPIO_set(&lcdSpiCSPin); 63 Atmel SAM R21 优势整合,精“芯”构造 GPIO_clr(&lcdSpiCSPin); Atmel SAM R21 Xplained Pro 实战演练 /* Reset LCD before Initialization*/ GPIO_clr(&lcdResetPin); HAL_Delay(100); GPIO_set(&lcdResetPin); /* Multiplex ratio 1/32 Duty (0x0F~0x3F) */ lcdCommand(LCD_CMD_SET_MULTIPLEX_RATIO); lcdCommand(0x1F); /* Set Display Offset */ lcdCommand(LCD_CMD_SET_DISPLAY_OFFSET); lcdCommand(0x00); /* Set Display Start Line (0x00~0x3F) */ lcdCommand(LCD_CMD_SET_DISPLAY_START_LINE(0x00)); /* Set Column Address 0 Mapped to SEG0 */ lcdCommand(LCD_CMD_SET_SEGMENT_RE_MAP_COL127_SEG0); /* Set COM/Row Scan Scan from COM63 to 0 */ lcdCommand(LCD_CMD_SET_COM_OUTPUT_SCAN_DOWN); /* Set COM Pins hardware configuration */ lcdCommand(LCD_CMD_SET_COM_PINS); lcdCommand(0x02); /* Set Contrast Control */ lcdCommand(LCD_CMD_SET_CONTRAST_CONTROL_FOR_BANK0); lcdCommand(0x7F); /* Disable Entire display On */ lcdCommand(LCD_CMD_ENTIRE_DISPLAY_AND_GDDRAM_ON); /* Set Normal Display */ lcdCommand(LCD_CMD_SET_NORMAL_DISPLAY); /* Set Display Oscillator Frequency/Clock Divide Ratio */ lcdCommand(LCD_CMD_SET_DISPLAY_CLOCK_DIVIDE_RATIO); lcdCommand(0x80); 64 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 /* Enable charge pump regulator */ lcdCommand(LCD_CMD_SET_CHARGE_PUMP_SETTING); lcdCommand(0x14); /* Set Display On */ lcdCommand(LCD_CMD_SET_DISPLAY_ON); BSP_LcdCls(); } #endif // BSP_SUPPORT == BOARD_SAMR21_ZLLEK 四、修改 SPI 初始化 void BSP_BoardSpecificSpiPinInit(SpiChannel_t tty) //OLED1 XPLAINED 板 //PINMUX_PB23D_SERCOM5_PAD3:SPI_SCK //PINMUX_PB22D_SERCOM5_PAD2:SPI_MOSI tty->spiPinConfig[SPI_SCK_SIG].pinNum = 23; //SPI_SCK = PB23 tty->spiPinConfig[SPI_SCK_SIG].portNum = PORT_B; tty->spiPinConfig[SPI_SCK_SIG].functionConfig = 3; tty->spiPinConfig[SPI_MOSI_SIG].pinNum = 22; //SPI_MOSI = PB22 tty->spiPinConfig[SPI_MOSI_SIG].portNum = PORT_B; tty->spiPinConfig[SPI_MOSI_SIG].functionConfig = 3; tty->dopoConfig = 1; // 数据手册 MOSI,SCK 脚 tty->dipoConfig = 0; 总结:在系统中增加外设驱动要修改低层驱动部分!注意配置文件中的宏定义! 详情请见:http://bbs.eeworld.com.cn/thread-455747-1-1.html 65 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.2 基于 Atmel SAM R21 Xplained 的超市手写价格标签 3.2.1 综述 〇、作品背景 其实作品最初的想法来源于一次看广告 广告大概内容是把学生们的课本都制作成电子书,用平板代替课本,可以减轻学生的体力负担联想 到课堂上老师们都是使用 PPT 进行授课,但是实际还是无法脱离传统的黑板进行必要的板书就想着实 现一个完全没有黑板的课堂 ---- 无线手写设备,正好论坛上有 R21 的试用活动,正好借机实现一下。 但是,R21 是基于 ZigBee 的无线套件,低功耗和快速自组网是比较大的优势,所以随着作品制作的深 入,后来想来想去,变成了超市手写价格标签。 一、作品功能展示 最开始是想实现一套无线手写设备,来完成无黑板无粉笔的课堂,最扰人的是接收显示侧的方案 考虑过 R21+VGA 的形式实现,想到 VGA 对主频的要求,决然放弃。考虑过 R21+CPLD+VGA 的形 式实现,想到龟速的 ATMEL Stuidio 和臃肿的 Quartus,果断退缩,考虑过 R21+Labview 上位的形 式实现,这个待续 ...... 嘿嘿 于是采用了最简单的 R21+LCD 的形式实现。实际上,作品在这个方面实现得还算差强人意: 随着对 ZigBee 的深入了解发现它一个比较大的优势是快速自组网,以及超低功耗,所以就为最初 的无线手写寻找了另外一个使用场景:超市手写标签采用了墨水屏这种不刷新不耗电,掉电也能正常显 示的屏幕。效果也还将就,字就难看了点,请自行滤波 66 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 嗯,神一样的超市阿姨又有创作平台了 上个掉电显示的图吧 二、硬件设计 因为纯粹作为业余爱好者参与,所以没有进行复杂的硬件设计和打样,基本上都是使用面包板、洞 洞板之类的物料再加上一些现有小模块,手写发送侧图片: 67 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 手写侧采用 SPI 接口 ( 使用 R21 的 EXT1) 的 LCD 电阻触摸屏来实现 在书写的同时,R21 还进行触屏坐标的采集 并将坐标发送给接收显示侧 接收显示侧图片: 68 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 接收侧采用一块 Arduino UNO R3+2.7 寸墨水屏和 R21 的组合 Arduino 与 R21 之间用简单串口通信,未制定过多通信协议 R21 接收并保存发送侧的显示数据,将显示数据送 UNO 再通过 R21 的按键,将墨水屏进行刷新 这里不得已又多出了一块 UNO 主要原因是太小看墨水屏的驱动了 1、墨水屏 recharge 要求 100k-300kHz 的占空比 0.5 的 PWM,一大堆外部控制 IO(9 个的样子) 2、每次都是整屏刷新,每次显示需要至少 4 步整屏刷新 step,每步在 300ms-600ms 不等 3、由于需要整屏刷新,每刷一次需要 264x176x? 位的数据缓存,占用大量 RAM, 加上无线传 输的数据,R21 的 RAM 已经使用到 99.8% 了,经常连主函数都进不去。 后来用 SD 卡来进行刷屏数 据缓存,结果发现,SAMR21 板的 IO 口和 EXT SPI 已经折腾完了。。。。目前只能用 R21 勉强清屏, 再加上 AS 的运行速度已经实在是无法忍受,无奈只能在 Uno R3 上跑了。 物料清单: SAMR21 Xplained Pro 2块 面包板 1 块 LCD 触摸屏 1 块 墨水屏 3.7v 锂电池 2块 接插件、排线 若干 三、软件设计 69 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 整个软件框架是基于 WSN 来进行设计的大概的工作流程就是:手写发送侧采集满 30 组坐标数 据 (XY 各 30 个 ) 后或者在一定时间内发送数据缓存不为空,进行一次发送,将坐标数据发送给接 收显示侧,接收显示侧在完成一次数据接收后通过串口将数据发送给 Arduino,同时等待按键信息 发现按键触发,则向 Arduino 发送刷新墨水屏命令,然后进行长达 3s 的刷屏过程上码,基于 Atmel Studio6.2+ASF3.21.0,代码比较乱: 点击下载 lwmesh-dones.rar 顺便把墨水屏的驱动也发上来,有兴趣的可以撸去研究一下 点击下载 EPD Xplained Pro_Source for SAM4L_SAMD20_v1.1.0 (Atmel Studio v6.1)s.rar 一些心得及想法 这次活动,稍微了解了一下 ZigBee 这种通信方式的运行机制,但并不是很深入,只是能够简单地 用起来。关于板子,ATMEL 的评估板真没得说,像艺术一样,设计得非常出众,就连电源、天线都有 好多种选择,强力赞一个!关于 ASF,这是近几年 ATMEL 在力推的一个驱动库,写得很用心,更新 也非常及时。从代码风格上来看,写库的团队肯定是有非常深厚的编程语言功底,但是个人觉得,并不 太适合于初学者,有一定编程经验的筒子应该相对比较容易切入,关于 Atmel Studio,打开软件,就 知道是花了很多心血来开发的支持各种扩展部件,界面也非常好看。个人角度来看,可能是由于采用了 VS 框架的缘故,软件运行的效率,其实非常有限,楼主能够流程运行 CCS、LPCXpresso 的电脑, 对这个平台可是伺候不起,经常编译个 20 分钟,泪奔啊!排开 MDK 和 IAR,还是 Eclipse 大法好 关于作品,其实手写是最简单的实现方式,基本上算是点对点了。如果有时间和精力的话,其实可以尝 试写入常见的字库和符号,使用上位机 ( 或者矩阵键盘 ) 编辑价格内容,通过设备的 PANID 去对价格 内容进行一一对应的发布尤其适合在大型超市这种设备相对较密集,死角比较多的场合,这种方式更加 能够凸显 ZigBee 的快速自组网特性。 详情请查看:http://bbs.eeworld.com.cn/thread-458151-1-1.html 70 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.2.2 设计详解之闪起那骚亮的小黄灯 安装 AS6.2SP1,折腾了一上午,死活出现 help 文档安装失败, 双击小甲虫运行 AS 就提示灾难性错误 后来想起昨晚通过百度云离线下载的安装包 估计问题就在这 果断上官网重新用 chrome 下载 安装、运行 手起刀落,世界安静了 ...... 晚上简单跑了几个例程,瞟了几眼 R21 的数据手册 撸例程、升级 EDBG 固件等等的过程,坛子里面其它大神已经有很详细的解释了 这里就不现了 先说说觉得比较有意思的地方吧 1. 虽然说是 SAM R21 系列,其实就是 D21+AT86RF233 的合体,有图为证,数据手册 (preliminary) 第 9 页的 bolck 暴露了一切 2. ATMEL 折腾出一个很有意思的东东,叫 SERCOM 目前的大致理解是串行通信接口,这个接口可以设置为 IIC、SPI、USART 这个就有点意思了,后面再慢慢研究,嘿嘿 还有一些其他什么 event 事件触发等等听上去很牛 x 的东西,后面慢慢理解吧。 ---------------------------------------------------------------------- 71 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 -----------------------------------大致上了解了一下,自己动手写点啥吧 老规矩,闪个灯吧 找了半天,没有 GPIO 相关的东东 只有个 XXXToggle 的例子,打开一看,用按键控制 LED getting start 也把定时器、中断、USART 都整进去了 不合逻辑呀 注意到第一个例程,DELAY_EXAMPLE1 打开一看,居然只有这货: 说好的例程呢? c 文件呢? 好吧,自己写吧 其实如果用过其他厂家 CORTEX-M 内核的控制器,其实可以自己慢慢通过在线帮助,把简单的 代码折腾出来,大概写了一段: 72 Atmel SAM R21 优势整合,精“芯”构造 /* * main.c * * Created: 2014/12/18 星期四 21:43:04 * Author: Liao */ #include Atmel SAM R21 Xplained Pro 实战演练 int main(void) {struct port_config Port_con; // 定义结构体,传递成员变量用于初始化 gpio system_init(); // 板子的初始化,时钟之类云云 delay_init(); // 延时初始化 port_get_config_defaults(&Port_con);// 恢复端口默认设置 Port_con.direction = SYSTEM_PINMUX_PIN_DIR_OUTPUT;// 结构体 Port_con 子成员端 口方向 Port_con.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;// 结构体 Port_con 子成员端 口上下拉设置 port_pin_set_config(LED0,&Port_con);// 传递结构体参数初始化 LED0,LED0 在库里面 定义为 PIN_PA19 while (1) { port_pin_toggle_output_level(LED0);//IO 翻转 delay_ms(200);// 延时 200Ms } } 编译,RUN。。。。。。 正兴高采烈地等看灯亮 结果 IDE 提示 main 函数重复定义 NM,怒击错误,找到问题所在 突然觉得膝盖中了一箭 原来例程的主函数在这里: 73 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 大哥,你把主函数藏的这么深,有意思么 居然藏到 ASF-common2-services-delay-example 里面 ASF=The Atmel® Software Framework,这这这 ...... 鬼佬们都喜欢这样设置目录? 好吧不吐槽了 原谅我的无知 既然自己写了,注释掉 delay_example.c 文件 编译,下载,还好正常跑起来了 详情请查看:http://bbs.eeworld.com.cn/thread-453031-1-1.html 74 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.2.3 设计详解之 SERCOM ! SERCOM ! 最早在浏览 R21 数据手册的时候就注意到了 SERCOM 这么个玩意儿 , 目前的理解,类似于端口 复用 , 这种模块其实很多厂家不同内核的单片机都有,STM、TI、PIC 等等 , 不过 ATMEL 并不是将单 个端口进行复用 , 而是将整个串行通信模块进行复用 , 可以复用的模块种类主要是 USART、SPI 和 IIC 框图: R21 共有 6 个 SERCOM,但只有 5 个可以复用 Note: 1. SERCOM4 is internally connected to the AT86RF233. SERCOM4 被 用 作 SPI 接 口, 使 内 核 与 AT86RF233 进 行 通 信, 这 个 口 并 未 引 出 , 每 个 SERCOM 其实都包含有三个寄存器、4 个端口(PAD0-PAD3)和一系列内部模块 , 针对不同的通信 方式,每个寄存器和端口的作用又不一样,但内部模块是可以通用的 , 其实在配置 SERCOM 的时候, 同样也是需要配置复用端口的,看看 SERCOM3 进行 SPI 的配置 spi_get_config_defaults(&config);// 恢复默认设置 SPI //config.mode = CONF_SPI_MASTER_MODULE;// 理论上应该有这一句,但是例程中没有, 例程头文件已经定义了 config.mux_setting = CONF_SPI_MASTER_SPI_MUX; //MUX 设置为 SPI 功能 config.pinmux_pad0 = CONF_SPI_MASTER_DATA_IN_PIN_MUX;// 配置 DIN config.pinmux_pad1 = PINMUX_UNUSED;// 未使用 config.pinmux_pad2 = CONF_SPI_MASTER_DATA_OUT_PIN_MUX;// 配置 DOUT config.pinmux_pad3 = CONF_SPI_MASTER_SCK_PIN_MUX;// 配置 SCK config.mode_specific.master.baudrate = TEST_SPI_BAUDRATE;// 配置 SPI 速率 status = spi_init(&master, CONF_SPI_MASTER_MODULE, &config);// 初始化 这里例程里面没有设置 SERCOM 口,其实在例程的头文件里面就配置这个 SPI 口在 SERCOM3(CONF_SPI_MASTER_MODULE) 了 瞧瞧数据手册: 75 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 手册上说,PB02、PB03、PB22、PB23 可用作 SERCOM5 就拿这货开刀,把 SERCOM5 配置成 USART 和 SPI -----------------------------------------------------------------------------------------------------------------------------1. USART 直接上代码: usart_get_config_defaults(&config_usart); config_usart.baudrate = 115200; config_usart.mux_setting = USART_RX_1_TX_0_XCK_1; config_usart.pinmux_pad0 = PINMUX_PB02D_SERCOM5_PAD0; config_usart.pinmux_pad1 = PINMUX_PB03D_SERCOM5_PAD1; config_usart.pinmux_pad2 = PINMUX_PB22D_SERCOM5_PAD2; config_usart.pinmux_pad3 = PINMUX_PB23D_SERCOM5_PAD3; while (usart_init(&usart_instance, SERCOM5, &config_usart) != STATUS_OK) { } 其实通信只用到了 PB02 和 PB03,估计 pad2 和 pad3 直接设置为 UNUSE 就行了硬件连接 : 在看 ATMEL 的串口时,发现在 AS 的代码里面,串口服务函数里面有些 Callback 函数 , 它可以 根据串口缓存的大小来使用,接收的字符数量等于或者超过串口缓存的大小,就调用 callback 函数 , 类 似于串口中断服务程序 . 这里觉得 ATMEL 确实是很牛 x, 个人理解,串口缓存是由软件进行判断,所以 76 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 服务函数叫 callback,而不叫中断服务函数 , 真正意义上的中断应该是完全由硬件引起的吧 , 不得不佩 服 ATMEL 的严谨 , 感觉被 ST 给骗了,什么玩意儿都叫中断 , 上 GIF: 串口助手 2s 发送一次数据“Hello EEWORLD!”,给 R21 回显 串口缓存 1 个字节就 callback 2. 自环 SPI 测试 把 SERCOM3 配置成 master,把 SERCOM5 配置成 slave spi_get_config_defaults(&config); config.mux_setting = CONF_SPI_MASTER_SPI_MUX; config.pinmux_pad0 = CONF_SPI_MASTER_DATA_IN_PIN_MUX; config.pinmux_pad1 = PINMUX_UNUSED; config.pinmux_pad2 = CONF_SPI_MASTER_DATA_OUT_PIN_MUX; config.pinmux_pad3 = CONF_SPI_MASTER_SCK_PIN_MUX; config.mode_specific.master.baudrate = TEST_SPI_BAUDRATE; status = spi_init(&master, CONF_SPI_MASTER_MODULE, &config); test_assert_true(test, status == STATUS_OK, “SPI master initialization failed”); /* Enable the SPI master */ spi_enable(&master); status = STATUS_ERR_IO; /* Configure the SPI slave */ spi_get_config_defaults(&config); config.mode = SPI_MODE_SLAVE; config.mux_setting = CONF_SPI_SLAVE_SPI_MUX; config.pinmux_pad0 = CONF_SPI_SLAVE_DATA_IN_PIN_MUX; config.pinmux_pad1 = CONF_SPI_SLAVE_SS_PIN_MUX; config.pinmux_pad2 = CONF_SPI_SLAVE_DATA_OUT_PIN_MUX; config.pinmux_pad3 = CONF_SPI_SLAVE_SCK_PIN_MUX; config.mode_specific.slave.frame_format = SPI_FRAME_FORMAT_SPI_FRAME; config.mode_specific.slave.preload_enable = true; status = spi_init(&slave, CONF_SPI_SLAVE_MODULE, &config); test_assert_true(test, status == STATUS_OK, “SPI slave initialization failed”); /* Enable the SPI slave */ spi_enable(&slave); 不多解释了 77 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 硬件连接: EXT1 PIN15 (PB03) <--> EXT1 PIN10 (PA23) EXT1 PIN16 (PB22) <--> EXT1 PIN9 (PA22) EXT1 PIN17 (PB02) <--> EXT1 PIN7 (PA18) EXT1 PIN18 (PB23) <--> EXT1 PIN8 (PA19) 上 GIF: 今天只是简单测试了一下传说中的 SERCOM 下回研究一下 R21 的时钟 详情请见:http://bbs.eeworld.com.cn/thread-453109-1-1.html 78 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.2.4 设计详解之 使用 SPI 驱动微雪 LCD 看着论坛大神都开始可劲折腾 zigbee 楼主还在折腾基本外设 , 这几天简单看了看 R21 的 SPI 外设 , 手上有几块 LCD,不过都是并口的,还好微雪的 LCD 支持 SPI, 这货的 LCD 驱动 IC 是 BD663474, 触摸 IC 是 XPT2046,今天先驱动一下 LCD,触摸后面再折腾 , 不过这货够奇葩的,有图有真相 没错,您没眼花,居然是一块 Altera 的 CPLD, 官方文档解释说这块 CPLD 是把 SPI 接口转成 8086 并行接口,与 BD663474 通信 , 但是 BD663474 却这样说 BD663474 驱动 IC 直接原生就支持 SPI 啊,楼主也是醉了,有钳就是要横着走 , 就是这么个接口, 让楼主用 R21 的 SPI 外设驱动这块 LCD,花了 2 天时间 . 先看看 ASF 中的 SPI 驱动吧,对于 SPImaste 的配置,顶层就有 spi_module、spi_config 俩个结构体 , 这俩结构体下面有包含许多的 enum 79 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 数据类型,原来都在枚举啊 看看 spi_config: 1 struct spi_config { 2 /** SPI mode. */ 3 enum spi_mode mode; 4 /** Data order. */ 5 enum spi_data_order data_order; 6 /** Transfer mode. */ 7 enum spi_transfer_mode transfer_mode; 8 /** MUX setting. */ 9 enum spi_signal_mux_setting mux_setting; 10 /** SPI character size. */ 11 enum spi_character_size character_size; 12 /** Enabled in sleep modes. */ 13 bool run_in_standby; 14 /** Enable receiver. */ 15 bool receiver_enable; 16 # ifdef FEATURE_SPI_SLAVE_SELECT_LOW_DETECT 17 /** Enable Slave Select Low Detect. */ 18 bool select_slave_low_detect_enable; 19 # endif 20 # ifdef FEATURE_SPI_HARDWARE_SLAVE_SELECT 21 /** Enable Master Slave Select. */ 22 bool master_slave_select_enable; 23 # endif 24 /** Union for slave or master specific configuration. */ 25 union { 26 /** Slave specific configuration. */ 27 struct spi_slave_config slave; 28 /** Master specific configuration. */ 29 struct spi_master_config master; 30 } mode_specific; 31 /** GCLK generator to use as clock source. */ 32 enum gclk_generator generator_source; 33 /** PAD0 pinmux. */ 34 uint32_t pinmux_pad0; 35 /** PAD1 pinmux. */ 36 uint32_t pinmux_pad1; 37 /** PAD2 pinmux. */ 38 uint32_t pinmux_pad2; 39 /** PAD3 pinmux. */ 40 uint32_t pinmux_pad3; 41 }; 再去查看枚举类型 spi_mode: 80 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 1 enum spi_mode { 2 /** Master mode. */ 3 SPI_MODE_MASTER = 1, 4 /** Slave mode. */ 5 SPI_MODE_SLAVE = 0, 6 }; 转来转去,人就晕菜了 , 给 ATMEL 写库函数的哥们,以前肯定是写 Linux 代码的。这生态圈,只 给大牛们玩啊 , 好吧,不吐槽了,来驱动 LCDSPI 需要配置的东西相对比较多,譬如主从、发送顺序、 发送模式、发送字节数等等 , 这些都在 spi_get_config_defaults 这个函数中有处理,这个函数在 spi.h 文件里头 static inline void spi_get_config_defaults( struct spi_config *const config) { /* Sanity check arguments */ Assert(config); /* Default configuration values */ config->mode = SPI_MODE_MASTER; config->data_order = SPI_DATA_ORDER_MSB; config->transfer_mode = SPI_TRANSFER_MODE_0; config->mux_setting = SPI_SIGNAL_MUX_SETTING_D; config->character_size = SPI_CHARACTER_SIZE_8BIT; config->run_in_standby = false; config->receiver_enable = false; # ifdef FEATURE_SPI_SLAVE_SELECT_LOW_DETECT config->select_slave_low_detect_enable= true; # endif # ifdef FEATURE_SPI_HARDWARE_SLAVE_SELECT config->master_slave_select_enable= false; # endif config->generator_source = GCLK_GENERATOR_0; /* Clear mode specific config */ memset(&(config->mode_specific), 0, sizeof(config->mode_specific)); /* Master config defaults */ config->mode_specific.master.baudrate = 500000; /* pinmux config defaults */ config->pinmux_pad0 = PINMUX_DEFAULT; config->pinmux_pad1 = PINMUX_DEFAULT; config->pinmux_pad2 = PINMUX_DEFAULT; config->pinmux_pad3 = PINMUX_DEFAULT; }; 81 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 如果要配置这些,就得去修改 , 或者通过 spi_config 结构体去调整 , 对比 BD663474 的时序: 时钟空闲为高,第二个时钟边沿采样 看看 R21 的 SPI 模式: enum spi_transfer_mode { /** Mode 0. Leading edge: rising, sample. Trailing edge: falling, setup. */ SPI_TRANSFER_MODE_0 = 0, /** Mode 1. Leading edge: rising, setup. Trailing edge: falling, sample. */ SPI_TRANSFER_MODE_1 = SERCOM_SPI_CTRLA_CPHA, /** Mode 2. Leading edge: falling, sample. Trailing edge: rising, setup. */ SPI_TRANSFER_MODE_2 = SERCOM_SPI_CTRLA_CPOL, /** Mode 3. Leading edge: falling, setup. Trailing edge: rising, sample. */ SPI_TRANSFER_MODE_3 = SERCOM_SPI_CTRLA_CPHA | SERCOM_SPI_CTRLA_CPOL, }; 从那么在 R21 的 spi 配置中,应该是属于 MODE 3 呀 , 按照这个思路,捣鼓了一晚上,啥都末出现 回头看了看 Open1081 的代码,恍然大悟 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_CPHA_1Edge+SPI_CPOL_Low,这货配置的 SPI 是标准 MODE 0 啊 , 估计经过了那块 接口转换的 CPLD,SPI 定制成了 MODE 0,BD663474 本身的 SPI 接口其实根本就没有使用 , 坑爹啊, 82 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 调了 2 个晚上了 还好最终解决问题主函数代码: int main(void) { SystemInit(); configure_usart(); usart_write_buffer_wait(&usart_instance, "test\r\n", sizeof("test\r\n")); LCD_RST; delay_ms(10); LCD_RST_DONE; LCD_Initializtion(); LCD_Clear(Yellow); GUI_Text(0,170,"Welcome SAMR21 Xplained Pro",Red,Yellow); GUI_Text(0,186,"Hello,EEWorld!! I'm Ljj3166!",Red,Yellow); LCD_DrawLine(0,120,239,120,Red); LCD_DrawLine(0,121,239,121,Red); LCD_DrawLine(0,0,0,120,Red); LCD_DrawLine(0,1,0,121,Red); LCD_DrawLine(40,40,40,120,Red); LCD_DrawLine(41,41,41,121,Red); LCD_DrawLine(80,80,80,120,Red); LCD_DrawLine(81,81,81,121,Red); LCD_DrawLine(100,100,100,120,Red); LCD_DrawLine(101,101,101,121,Red); while (true) { delay_ms(300); port_pin_toggle_output_level(LED0); } } 有图有视频,才是真的有真相 83 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 详情请见:http://bbs.eeworld.com.cn/thread-454206-1-1.html 84 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.2.5 设计详解之时钟、SPI 和触摸 1、时钟 在上篇帖子:http://bbs.eeworld.com.cn/thread-454206-1-1.html 里面,虽然驱动起来了 LCD 显示 , 但是刷新速率很慢,第一反应时 SPI 的时钟速度 ,R21 的 SPI 设置,默认情况下是 100KHz,修 改到 500KHz,刷新速度上来了一些,但是依然不尽人意。 来看看时钟吧 阅读数据手册发现在默认情况下,R21 的时钟居然是令人发指的 1MHz, 没办法,谁叫它冲着低功 耗物联网应用呢 , 写了几句代码,测试一下 SysTick_Config(1000); SysTick_Handler() { port_pin_toggle_output_level(PIN_PA14); } 无敌的 systick,和 systick 服务 , 大致意思是每千分之一的时钟,把 PA14 翻转一次 , 看看默认情 况下,PA14 口的波形 真的是 1kHz 的样子 , 开始捯饬时钟吧 , 做个简单的配置 void clock_init(){ struct system_clock_source_osc8m_config osc8m_conf; system_clock_source_osc8m_get_config_defaults(&osc8m_conf); osc8m_conf.prescaler = SYSTEM_OSC8M_DIV_1; osc8m_conf.on_demand = true; 85 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 osc8m_conf.run_in_standby = false; system_clock_source_osc8m_set_config(&osc8m_conf); system_clock_source_enable(GCLK_SOURCE_OSC8M); system_cpu_clock_set_divider(SYSTEM_MAIN_CLOCK_DIV_1); system_apb_clock_set_divider(SYSTEM_CLOCK_APB_APBA, SYSTEM_MAIN_CLOCK_DIV_1); system_apb_clock_set_divider(SYSTEM_CLOCK_APB_APBB, SYSTEM_MAIN_CLOCK_DIV_1); system_apb_clock_set_divider(SYSTEM_CLOCK_APB_APBC, SYSTEM_MAIN_CLOCK_DIV_1); } 开启卑职的 8M 时钟,再泡泡 systick 看看 嗯,差不多 8kHz 的样子 手上就这个渣渣 USBee,普源神马的,快到碗里来!!!! 时钟配置之后,刷屏速度那是杠杠的 也尝试过外置晶振、DPLL、DFLL,一次没成功,不折腾了 8M 实测目前也够用了,以后再说 2、SPI 配置 这块屏很有意思,驱动 IC 和触摸 IC 使用同一条 SPI 总线 CLK 和 MOSI 共用,由于液晶驱动 IC 无需发送数据给 R21,所以 MISO 就由触摸 IC 使用 86 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 所有的 SPI 处理过程都由 CPLD 处理,和驱动 IC、触摸 IC 没有半毛钱关系。所以它们的数据手 册还是别看了 R21 刚开始死活接收不到触摸 IC 返回的数据,从串口打印发现 MISO 接收到的都是 0 挂上 USBee,发现实际上 MISO 是有数据过来的 把 R21 的 MISO 直接到 Vcc,发现接收到的数据依然为 0 毫无疑问,R21 的 SPI 配置有问题 捯饬了半天,才整好,其实也是受了 ASF 的蛊惑 看正确的配置 uint16_t SPI_Communication(uint16_t send_char) { uint16_t RX_data; while (!spi_is_ready_to_write(&spi_master_instance)) {} spi_write(&spi_master_instance, send_char); while(!spi_is_write_complete(&spi_master_instance)){} while(!spi_is_ready_to_read(&spi_master_instance)){} spi_read(&spi_master_instance,&RX_data); return RX_data; } 其实和很多 SPI 通信一样,通过查询方式通信。但是,看了 ASF 中对 spi_write 和 spi_read 的描 述,看看 spi_write 的代码 static inline enum status_code spi_write( struct spi_module *module, uint16_t tx_data) { /* Sanity check arguments */ Assert(module); Assert(module->hw); SercomSpi *const spi_module = &(module->hw->SPI); /* Check if the data register has been copied to the shift register */ if (!spi_is_ready_to_write(module)) { /* Data register has not been copied to the shift register, return */ return STATUS_BUSY; } /* Write the character to the DATA register */ spi_module->DATA.reg = tx_data & SERCOM_SPI_DATA_MASK; return STATUS_OK; } 其实已经调用了查询函数 spi_is_ready_to_write,没看清楚用的是 if,结果折腾了老半天,请原 谅楼主的不仔细 87 Atmel SAM R21 优势整合,精“芯”构造 再翻出 ASF 宝典 Atmel SAM R21 Xplained Pro 实战演练 里焦外嫩啊 果断在相关位置撸上这几句 while (!spi_is_ready_to_write(&spi_master_instance)) {} while(!spi_is_write_complete(&spi_master_instance)){} while(!spi_is_ready_to_read(&spi_master_instance)){} 手起刀落,一切结束了 还有 SPI 的频率,似乎和 main clock 有关,只能到一半这个样子 8M 下,spi 最大可以到 4M 数据手册上也没看到具体的说明,这里有些很奇怪的问题 4M 可以跑,1M 可以跑,2M、3M 居然不行;400k 可以跑,40k 可以跑,500k、800k 居然跑 不了 ATMEL 的时钟,真不是一般的复杂啊 3、触摸屏 SPI 时钟对这个触摸的影响确实很大 上 M 的时钟,校准会出错 太低的时钟,显示速度慢到坑爹 书写时还有断线的现象 MXCHIP 官方给出的驱动,算法上还得要仔细推敲一下才行 后面再慢慢折腾吧 最后上个测试视频吧,可以从串口采集点击触摸屏的坐标 88 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 触摸屏的数据基本上已经能够采集到了,接下来通过无线广播出去 详情请见:http://bbs.eeworld.com.cn/thread-454296-1-1.html 89 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.2.6 设计详解之简单了解 ZigBee 开始折腾 ZigBee 相关的内容了 今次跑了一下 WSNDEMO,感谢 @dcexpert 这篇帖子的指导 http://bbs.eeworld.com.cn/ thread-452982-1-1.html 让楼主避开了几个大坑 , 但是使用 WSNMonitor 的时候,依然遇到了神级 大坑,譬如: windows8 下面,连接选项根本没有串口,坑爹啊 , 换到 xp 下一切 ok: 上一个 DEMO 运行的 GIF 90 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 ZigBee 以前基本上只闻大名,还是第一次使用 基本概念还不是特别熟悉,发现网络中三种设备比较有意思 专门去脑补了一下 好搜索引擎与烂搜索引擎的区别在于,好搜索在开头的时候就知道你想找什么,而烂搜索呢,到找 到最后你也不知道他在找什么。。。 果断请出 Google 大神: 其实 IEEE 802.15.4 就是 ZIGBee 的基础 IEEE 802.15.4 无线网络协议中定义了两种设备:全功能设备 (FFDs) 和半功能设备 (RFDs)。 FFD 可以执行 IEEE 802.15.4 标准中的所有功能,并且可以在网络中扮演任何角色 那反过来讲,RFD 就有功能限制啦。比如 FFD 能与网络中的任何设备“说话” 而 RFD 就只能和 FFD“私聊”啦。RFD 设备的用途是为了做一些简单功能的应用 , 比如做个开关 之类的。而其功耗与内存大小都比 FFD 要小很多。 IEEE 802.15.4 网络中,一个 FFD 可以扮演三个角色-协调器(Coordinator)、PAN 协调器(PAN coordinator)和设备(device), 其中协调器是一个全功能设备(FFD),它可以在网络中传递信息(做 传话筒), 如果一个协调器在一个 PAN(personal area network,个人区域网络)网络中做主控制器 那我们把它叫做 PAN 协调器。除此之外,就叫设备 . 而 ATMEL ZigBee 的 WSNDEMO 里面定义了 三种设备:Coordinator、Router 和 End Device. Zigbee 协议中的定义与 IEEE 802.15.4 的定义大同小异,WSNDEMO 中的“router”是 IEEE 802.15.4 中的“PAN Coordinator";WSNDEMO 中的“Coordinator”就是 IEEE 802.15.4 中的 “Coordinator”,而“end device”就是指上面的平头百姓“device”鸟 , 至于网络拓扑,全世界都 知道的三种基本型,这里不叨叨了 从上面的定义里面,可以大致了解,信号拓扑可以是 1、Coordinator——Router;2、Coordinator——End Device;3、Coordinator—— Router——End Device, 每个网络中必须有个 Coordinator 作为主控制器,子网络中可以使用 Router 桥接 End Device 与 Coordinator 通信 91 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 Coordinator(0x0000)——Router(0x0001) Coordinator(0x0000)——End Device(0x9999) 晚上闲的,自己拿万用板焊了个转接板,用上 140mAh 的电池 , 勉强能用差不多 1 个小时 92 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 菊花照 电池充电照 全速运行照 详情请见:http://bbs.eeworld.com.cn/thread-454562-1-1.html 93 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.2.7 设计详解之 LWMESH-WSNDEMO 应用实验 今后一个月只能够使用老掉牙的古董电脑,编译一次得 5 分钟 昨晚折腾好久,终于搞定一个 LWMESH 的简单应用 大概的结构是 LCD——SAMR21......SAMR21——串口助手 主要作用是采集 LCD 上的描点,并通过 ZIGBEE 传输到另一块 R21,再通过串口转发给 PC 串 口助手 ------------------------------- 简单分析 -------------------------------WSNDEMO 的应用手册真是赞,虽然没有深入讲解 但是 LWMESH 的基本用法介绍得非常详细 这里简单小结一下: 0、基本代码结构 下面的代码,就是使用 LWMESH 的基本结构 static void APP_TaskHandler(void) { // Put your application code here } int main(void) { SYS_Init(); while (1) { SYS_TaskHandler(); APP_TaskHandler(); } } 各种初始化,然后是系统任务和应用程序的循环调用 WSNDEMO 中初始化和系统任务都已经搞定了,如果需要添加自己的代码 修改 APP_TaskHandler 就好了 1、网络的初始化 这里要配置一大堆的基础网络数据 , 瞧瞧 NWK_SetAddr(),配置 network address NWK_SetPanId(),配置 PAN ID PHY_SetChannel(),配置 frequency channel 94 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 PHY_SetBand(),配置频率 frequency band PHY_SetModulation(),配置调制模式 PHY_SetTxPower(),配置发射能量 ( 发射功率?) PHY_SetRxState(),配置接收端的状态 NWK_SetSecurityKey(),配置密匙 如果需要接收数据的话,还需要制定一个回调函数并使用 static bool appDataInd(NWK_DataInd_t *ind) { // process the frame return true; } NWK_OpenEndpoint(1, appDataInd); 初始化就是这么一大堆参数 2、发送数据、接收数据 WSNDEMO 定制了一些列发送和接收的结构体,成员变量类型各异 所以要发送数据的话,必须要格式相同 代码中自带的 AVR2130_LWMesh_Developer_Guide_v1.2.1.pdf 文件中有比较详细的描述 使用前建议看看 3、系统服务 主要是系统的计时器,其实是个软件定时器,如果没有特殊要求的话,个人觉得完全可以不用改动了 , 其他的底层类型定义、宏定义、基础配置参数之类的,这里就不深究了 --------------------------------------------- 改造 DEMO----------------------------------------------- 添加各种驱动 LCD 和触摸屏的头文件和 c 文件 在 APP_TaskHandler 中撸上自己的代码 static void APP_TaskHandler(void) { GetDisplayPoint(&display, Read_Ads7846(), &matrix ); if((temp.x != display.x)||(temp.y != display.y)){ printf("%d,%d\r\n",display.x,display.y);temp.x = display.x;temp.y = display.y; appMsg.SetX = display.x; appMsg.SetY = display.y; } else {temp.x = display.x;temp.y = display.y;} // Touch_Debug(); if((display.y)>290) 95 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 { for(is=0;is<10;is++) { if((21*isCTRL = 0x00; SysTick->LOAD = time; SysTick->VAL = 0x00; SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; /* 等待时间到 */ while( !(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); } } /** * @brief systick_timing * @note SysTick 定时函数 * @param none * @retval none */ void systick_timing(uint32_t time) { if (time <= SysTick_LOAD_RELOAD_Msk) { SysTick->CTRL = 0x00; /* 设置延时时间 */ SysTick->LOAD = time; /* 设置优先级 */ NVIC_SetPriority (SysTick_IRQn, (1 << __NVIC_PRIO_BITS) - 1); /* 清空计数器 */ SysTick->VAL = 0x00; 133 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_ CTRL_ENABLE_Msk; } } 好吧,继续说到那个通用的延时函数,目录在 \common2\services\delay\sam0\cycle_counter.c OPTIMIZE_HIGH RAMFUNC void portable_delay_cycles(unsigned long n) { UNUSED(n); __asm ( "loop: DMB \n" #ifdef __ICCARM__ "SUBS r0, r0, #1 \n" #else "SUB r0, r0, #1 \n" #endif "CMP r0, #0 \n" "BNE loop " ); } 关于 OPTIMIZE_HIGH 和 RAMFUNC 留着给大家自己学习吧,不得不说现在 IDE 越做越好, 让工程师都变得低能了不少,直接一个 RAMFUNC 就把函数放到 RAM 中执行了,哎,殊不知还需要 实现拷贝函数。在 IAR 中就是我们熟悉的 __ramfunc。跟多的 delay 细节参考这个路径下的 cycle_ counter.c 和 cycle_counter.h 文件吧,毕竟是点评不好深入分析。 继续说 sercom 吧,这玩意呵呵,以前使用过富士通的 m3,那是第一次接触这种外设,只能说 是高级了。在 fujitsu 而言被他们称为 MFS 还有一个类似的东西是定时器被称为 MFT。哎,这东西就 一个字灵活好用,自由。富士通最大支持 8 个串口,还是比较给力的。当然了 atmel 是我在 mcu 产 品中第二个使用这种外设的,暂时不去追究他和 Fujitsu 哪个更早,只是从我的认知过程来看。继续说 说这种外设的驱动,不得不说,现在我算是有一些认可了,以前 Fujitsu 我看这种外设我总是去把他和 stm32 去比较,怎么没别人的写的那么好呢。哎,觉今是而昨非啊,这种复杂的外设不能做的那么简单, 这个驱动人家也是花了不少心思来做了。恩,还要说说驱动本身,不管是 atmel 还是 Fujitsu 都是采用 的 linux 的风格,基本上都是那套 read/write,真正使用过这个外设的同伴会知道,这驱动在中断上给 你做了一层封装,有个缓冲当你配置为中断模式后会自动进入中断把你的数据缓存起来,当你要使用的 时候直接调用 read 类似的函数就行了,同时还支持用户设置回调函数,让你可以做类似在中断中做一 些相关的事情。不过倒不是真实的中断回调 hock 函数,而仅仅是在你调用 read 类似的函数的时候才 会被调用,说来也好,这种方式你仔细想想,比通常的方式倒还优越不少,不想过多分析了,太辛苦。 当然 write 也是支持回调函数的,这样可以直接把闪灯放置到回调 hock 中这样可以实现以下场景,当 你的 485 数据写数据的时候需要闪灯指示,那这种是在好不过的了。我的配置函数,使用的板子默认的 I2C 接口,建议大家用这种口来试试,会有不少收获,而不仅仅是板载原生支持的配置,忘记说了针对 134 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 串口中断接收,做法是开启回调函数,设置回调函数,同时一定要注意轮询 read 类似函数才可以,针 对 atmel 我调用的是 uart_recv_process();。 /** * brief slip_arch_init * note SLIP 初始化移植接口 * param None * retval None */ void slip_arch_init(unsigned long ubr) { struct usart_config usart_conf; usart_get_config_defaults(&usart_conf); usart_conf.mux_setting = CONF_SLIP_MUX_SETTING; usart_conf.pinmux_pad0 = CONF_SLIP_PINMUX_PAD0; usart_conf.pinmux_pad1 = CONF_SLIP_PINMUX_PAD1; usart_conf.pinmux_pad2 = CONF_SLIP_PINMUX_PAD2; usart_conf.pinmux_pad3 = CONF_SLIP_PINMUX_PAD3; if (ubr) { usart_conf.baudrate } else { usart_conf.baudrate } = ubr; = CONF_SLIP_BAUDRATE; usart_serial_init(&uart_module, CONF_SLIP_USART_MODULE, &usart_conf); usart_enable(&uart_module); usart_register_callback(&uart_module, usart_read_callback, USART_CALLBACK_BUFFER_ RECEIVED); usart_enable_callback(&uart_module, USART_CALLBACK_BUFFER_RECEIVED); } [color=rgb(51, 102, 153) !important] 复制代码 /** * brief usart_read_callback * note UART 读取回调函数 -- 类似中断 ( 采用官方驱动的回调机制 , 需要轮询线程配合 ) * param None * retval None */ void usart_read_callback(const struct usart_module *const usart_module) { unsigned char c; c = RX_BUF[0]; slip_input_byte(c); } [color=rgb(51, 102, 153) !important] 复制代码 135 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 其他外设,继续说吧。RTIME 也就是关于 TC 定时器的使用,还有关于 NVM 的使用。后面继续说吧, 也压压楼看看运气吧,继续说 NVM,不得不说 atmel 是做 flash 的,这玩意考虑的很全面,有点当年 at45dbxxx 的感觉,到目前为止我没见过哪个 MCU 内置的 flash 是全区支持这种擦写操作的,不得不 说就是给力。这里说一下 R21 和 D21 是一样的仅仅多了一个 RADIO 所以不用担心一致性。 * 针对 SAMR21G18 NVM 存储结构确定,Flash 一共 256K * 页大小 64Bytes, 页数量 4096, 程序区 128K, 剩余 128K 用于文件系统 * SAMR21G18 NVM 支持的擦除方式为 ROW 擦除 ,4 个页为一个 ROW,所以最小的擦除单位是 256Byte 目前我已经在他的 NVM 上实现了微型日志文件系统的移植工作,支持擦写磨损均衡等,主要是采用垃 圾回收和链表结构来实现的。 XMEM 写驱动,已经测试过的,还要说说官方自带的 drivers 的事情,恩,这个驱动很不错,不要试图 和 stm32 的库来比较,没得比,他是优秀的,不要怀疑他,看起来乱,不会用,不方便,我只好说, 是你不懂用,水平 low 千万别怪别人的东西不好。 重要的路径 \sam0\utils\cmsis\samr21\include\instance\nvmctrl.h 这个文件很重要,相关外设都会有 类似的子头文件,需要引起注意,多看他就好了。 /** * @brief xmem_pwrite * @note XMEM 写操作 --addr 由上层控制为 ROW 地址对齐 * @param none * @retval none */ int xmem_pwrite(const void *_buf, int size, unsigned long addr) { uint8_t *bufPtr; int sizeCur, sizePae; enum status_code error_code; if (size > NVMCTRL_ROW_SIZE) { PRINTF("xmem_pwrite size too big\r\n"); } do { error_code = nvm_erase_row(addr); } while (error_code == STATUS_BUSY); /* * 注意此次的写操作是在本次的 ROW 对齐地址范围内 * 函数 nvm_write_buffer 实现在 PAGE 对齐地址范围内写操作 */ bufPtr = (uint8_t*)_buf; sizeCur = size; while (sizeCur > 0) { sizePae = NVMCTRL_PAGE_SIZE - addr%NVMCTRL_PAGE_SIZE; 136 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 sizePae = (sizeCur > NVMCTRL_PAGE_SIZE) ? sizePae : sizeCur; do { error_code = nvm_write_buffer(addr, bufPtr, sizePae); } while (error_code == STATUS_BUSY); bufPtr = bufPtr + sizePae; addr = addr + sizePae; sizeCur = sizeCur - sizePae; } return size; } \sam0\utils\cmsis\samr21\include\instance\nvmctrl.h 的一些细节,暴露给大家 /* ========== Instance parameters for NVMCTRL peripheral ========== */ #define NVMCTRL_AUX0_ADDRESS (NVMCTRL_USER_PAGE_ADDRESS + 0x00004000) #define NVMCTRL_AUX1_ADDRESS (NVMCTRL_USER_PAGE_ADDRESS + 0x00006000) #define NVMCTRL_AUX2_ADDRESS (NVMCTRL_USER_PAGE_ADDRESS + 0x00008000) #define NVMCTRL_AUX3_ADDRESS (NVMCTRL_USER_PAGE_ADDRESS + 0x0000A000) #define NVMCTRL_CLK_AHB_ID 4 #define NVMCTRL_FACTORY_WORD_IMPLEMENTED_MASK 0xC0000007FFFFFFFF #define NVMCTRL_FLASH_SIZE (NVMCTRL_PAGES*NVMCTRL_PAGE_SIZE) #define NVMCTRL_LOCKBIT_ADDRESS (NVMCTRL_USER_PAGE_ADDRESS + 0x00002000) #define NVMCTRL_PAGES 4096 #define NVMCTRL_PAGE_HW (NVMCTRL_PAGE_SIZE/2) #define NVMCTRL_PAGE_SIZE (1< NVMCTRL_ROW_SIZE) { PRINTF("xmem_pwrite size too big\r\n"); } do { error_code = nvm_erase_row(addr); } while (error_code == STATUS_BUSY); /* * 注意此次的写操作是在本次的 ROW 对齐地址范围内 * 函数 nvm_write_buffer 实现在 PAGE 对齐地址范围内写操作 */ bufPtr = (uint8_t*)_buf; sizeCur = size; while (sizeCur > 0) { sizePae = NVMCTRL_PAGE_SIZE - addr%NVMCTRL_PAGE_SIZE; sizePae = (sizeCur > NVMCTRL_PAGE_SIZE) ? sizePae : sizeCur; do { error_code = nvm_write_buffer(addr, bufPtr, sizePae); } while (error_code == STATUS_BUSY); bufPtr = bufPtr + sizePae; addr = addr + sizePae; sizeCur = sizeCur - sizePae; } return size; } \sam0\utils\cmsis\samr21\include\instance\nvmctrl.h 的一些细节,暴露给大家 /* ========== Instance parameters for NVMCTRL peripheral ========== */ #define NVMCTRL_AUX0_ADDRESS (NVMCTRL_USER_PAGE_ADDRESS + 0x00004000) 138 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 #define NVMCTRL_AUX1_ADDRESS (NVMCTRL_USER_PAGE_ADDRESS + 0x00006000) #define NVMCTRL_AUX2_ADDRESS (NVMCTRL_USER_PAGE_ADDRESS + 0x00008000) #define NVMCTRL_AUX3_ADDRESS (NVMCTRL_USER_PAGE_ADDRESS + 0x0000A000) #define NVMCTRL_CLK_AHB_ID 4 #define NVMCTRL_FACTORY_WORD_IMPLEMENTED_MASK 0xC0000007FFFFFFFF #define NVMCTRL_FLASH_SIZE (NVMCTRL_PAGES*NVMCTRL_PAGE_SIZE) #define NVMCTRL_LOCKBIT_ADDRESS (NVMCTRL_USER_PAGE_ADDRESS + 0x00002000) #define NVMCTRL_PAGES 4096 #define NVMCTRL_PAGE_HW (NVMCTRL_PAGE_SIZE/2) #define NVMCTRL_PAGE_SIZE (1< QVGA_WIDTH) { x = 0; temp_p = 0; temp_y = 0; y = QVGA_HIGH/2; en = 0; temp_x = 0; } tx = 5*rate; tx = ((temp_p+1)*tx) + temp_p*temp_x; if (tx <= x){ if (0 == en) en = 1; } if (en == 1){ 139 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 if (y != beats[temp_y]) { y += beats_Incr[temp_y] * 5; if (y==(QVGA_HIGH/2)+beats_Incr[4] * 5) { Play_Sound((108<<8 | 0x10), 100); } } else { temp_y++; if (temp_y > 9) { temp_y = 0; temp_p++; en = 0; temp_x = x - tx; } } } HAL_Write32(RAM_G+(x/rate)*4, VERTEX2F(x*16,y*16)); } /* ========Display list start======================================== */ HAL_CmdBufIn( CMD_DLSTART ); HAL_CmdBufIn( CLEAR_COLOR_RGB(0, 0, 0) ); HAL_CmdBufIn( CLEAR(1,1,1) ); HAL_CmdBufIn( COLOR_RGB(0,0,0) ); HAL_CmdBufIn( BITMAP_SOURCE(2048L)); HAL_CmdBufIn( BITMAP_LAYOUT(L8,1,QVGA_HIGH) ); HAL_CmdBufIn( BITMAP_SIZE(NEAREST, REPEAT, BORDER, QVGA_WIDTH, QVGA_HIGH) ); HAL_CmdBufIn( BEGIN(BITMAPS) ); HAL_CmdBufIn( TAG(0) ); HAL_CmdBufIn( VERTEX2F(0,0) ); HAL_CmdBufIn( COLOR_RGB(0x1B,0xE0,0x67) ); HAL_CmdBufIn( LINE_WIDTH(2*16) ); HAL_CmdBufIn( BEGIN(LINE_STRIP) ); Gpu_CoCmd_Append( RAM_G,(x/rate)*4 ); HAL_CmdBufIn( END() ); HAL_CmdBufIn( BEGIN(LINE_STRIP) ); if ((x/rate)<(QVGA_WIDTH/rate)-(50/rate)) { Gpu_CoCmd_Append( RAM_G+(x/rate)*4+((50/rate)*4), ((QVGA_WIDTH/rate)*4)-((x/ rate)*4)-((50/rate)*4) ); } HAL_CmdBufIn( END() ); HAL_CmdBufIn( POINT_SIZE(6*16) ); HAL_CmdBufIn( BEGIN(FTPOINTS) ); HAL_CmdBufIn( VERTEX2F(x*16,y*16) ); HAL_CmdBufIn( END() ); 140 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 HAL_CmdBufIn( COLOR_RGB(255,255,255) ); HAL_CmdBufIn( COLOR_A(100) ); HAL_CmdBufIn( BEGIN(EDGE_STRIP_R) ); HAL_CmdBufIn( VERTEX2F((hide_x+QVGA_WIDTH-80)*16,0) ); HAL_CmdBufIn( VERTEX2F((hide_x+QVGA_WIDTH-80)*16,QVGA_HIGH*16) ); HAL_CmdBufIn( COLOR_A(255) ); Gpu_Radiobutton( hide_x+QVGA_WIDTH-70,QVGA_HIGH-48,0xffffff,0,8,3,opt ); Gpu_Radiobutton( hide_x+QVGA_WIDTH-70,QVGA_HIGH-28,0xffffff,0,8,4,opt ); Gpu_Radiobutton( hide_x+QVGA_WIDTH-70,QVGA_HIGH-8 ,0xffffff,0,8,5,opt ); Gpu_Radiobutton( hide_x+QVGA_WIDTH-70,QVGA_HIGH-68,0xffffff,0,8,6,opt ); Gpu_CoCmd_Text( (hide_x+QVGA_WIDTH-60),QVGA_HIGH-48,26,OPT_CENTERY,"Sine" ); Gpu_CoCmd_Text( (hide_x+QVGA_WIDTH-60),QVGA_HIGH-28,26,OPT_CENTERY,"Sawtooth" ); Gpu_CoCmd_Text( (hide_x+QVGA_WIDTH-60),QVGA_HIGH-8 ,26,OPT_CENTERY,"Triangle" ); Gpu_CoCmd_Text( (hide_x+QVGA_WIDTH-60),QVGA_HIGH-68,26,OPT_CENTERY,"ECG" ); Gpu_CoCmd_Text( (hide_x+QVGA_WIDTH-60),20,30,OPT_CENTERY|OPT_CENTERX,"-" ); Gpu_CoCmd_Text( (hide_x+QVGA_WIDTH-20),20,30,OPT_CENTERY|OPT_CENTERX,"+" ); Gpu_CoCmd_Text ( (hide_x+QVGA_WIDTH-80),50,28,0, "Rate:" ); Gpu_CoCmd_Number( (hide_x+QVGA_WIDTH-30),50,28,0, rate ); Gpu_CoCmd_Text ( (hide_x+QVGA_WIDTH-80),80,28,0, "Pk:" ); Gpu_CoCmd_Number( (hide_x+QVGA_WIDTH-40),80,28,0, amp ); HAL_CmdBufIn( COLOR_A(50) ); HAL_CmdBufIn( POINT_SIZE(15*16) ); HAL_CmdBufIn( BEGIN(FTPOINTS) ); HAL_CmdBufIn( TAG(1) ); HAL_CmdBufIn( VERTEX2F((hide_x+QVGA_WIDTH-60)*16,20*16) ); HAL_CmdBufIn( TAG(2)); HAL_CmdBufIn( VERTEX2F((hide_x+QVGA_WIDTH-20)*16,20*16) ); /* DL 显示结束 */ HAL_CmdBufIn( DISPLAY() ); HAL_CmdBufIn( CMD_SWAP ); HAL_BufToReg( RAM_CMD, 0 ); 查看详情请点击:http://bbs.eeworld.com.cn/thread-457452-1-1.html 141 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.5.2 设计详解之 初步接触 恩,拿到板子有几天了,下载了 asf 跑了几个例程看了一下,还不错。去年弄过 atmel 的 M4 是个 wifi 的板子,老外设计的提供的 SDK 也是基于 AFS+FreeRTOS 这一套东西,当然核心的东西是 wifi 的协议栈。当初我就不太喜欢这个 atmel studio,没办法人家提供的 SDK 是这样的,只好将就使用了。 atmel studio 我只是说 IDE,纯粹是个人习惯问题,倒不是说 atmel 的问题,这玩意是微软的。有机会 后面我要尝试在 IAR 上来弄的。atmel studio 采用的编译器是 gcc 也算是比较好了,不挑剔的可以用 makefile 来搞,vim 这也算是一条路,真心是受不住微软的折腾,不大习惯。 接着说说 asf 相关的东西,官方的一些资源 http://asf.atmel.com/docs/latest/index.html 这个地址提供了关于 asf 的全部资料,可以看到 api 接口说明,相关文档,第三方软件包结构,无 线 WIRELESS 部分软件包细节等等。 我在这里下载了独立的 asf 软件包,后面我要自己弄到 IAR 中去的,包中的东西特别多,挺不错的, 我这里截图一下 WIRELESS 中支持的包 142 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 好了,这部分是关于 asf 的介绍,后面我主要还是弄我的网络所以重心是 rf 部分也就是 233 这个 芯片的细节问题了,也会穿插介绍一些 ieee 802.15.4 的知识。 关于 rf 的东西做起来尤其是这种带协议的包都比较复杂,一般是要有 802.15.4 的网络嗅探器的, 这玩意比较贵,淘宝上面都不便宜 600+ 以上的价格。其实 atmel 官方已经做了一些 kits 板子的支持了, 基本上那些东西都是参考官方的,恩软件需要 wireshark 软件的配合对数据包的分析,很有必要。对于 抓包器其实就是让他工作在混合模式,这些在 233 的手册中都是能找到的。 这里我也给出这部分的官方资料地址 http://www.atmel.com/webdoc/wirelesscomposer/index.html 随意截个图,大家看一下,毕竟有板子的人不多,对 rf 或者网络感兴趣的也不太多 查看详情请点击:http://bbs.eeworld.com.cn/thread-453053-1-1.html 143 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.5.3 设计详解之 Contiki-OS 移植篇 好吧,通过第一篇的探索,目前已经采用 IAR 来跑程序了,当然也修改了一下官方的程序结构,更 符合我自己的习惯。 【Atmel SAM R21 创意大赛周计划】+ 初步接触 继续说说现在的进度吧,基本上 Contiki-OS 已经移植差不多了,接下来基本上是 Radio 部分的驱 动和 CFS 的移植了。贴图吧,不知道说点啥。 1、最精简的 contiki-os 结构 144 Atmel SAM R21 优势整合,精“芯”构造 2、写了个简单的测试 Atmel SAM R21 Xplained Pro 实战演练 3、添加了网络部分的 contiki-os 结构 145 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 测试程序 /** * brief leds_process * note leds_process 线程 * param None * retval None */ PROCESS_THREAD(leds_process, ev, data) { static struct etimer et_leds; PROCESS_BEGIN(); etimer_set(&et_leds, CLOCK_SECOND); while (1) { PROCESS_WAIT_EVENT(); if (ev == PROCESS_EVENT_TIMER) { printf("# LED0 toggle..\r\n"); LED_Toggle(LED_0_PIN); etimer_reset(&et_leds); } } PROCESS_END(); } /** * brief dbgs_process * note dbgs_process * param None * retval None */ PROCESS_THREAD(dbgs_process, ev, data) { static struct etimer et_dbg; PROCESS_BEGIN(); etimer_set(&et_dbg, 5*CLOCK_SECOND); while (1) { PROCESS_WAIT_EVENT(); if (ev == PROCESS_EVENT_TIMER) { printf("# DBG task run..\r\n\r\n"); etimer_reset(&et_dbg); } } PROCESS_END(); } 146 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 主程序 /** * brief mian * note 程序入口 * param None * retval None */ int main(void) { system_init(); configure_console(); system_interrupt_enable_global(); clock_init(); process_init(); printf("# Contiki-OS on SAMR21_Xplained_Pro..\r\n"); process_start(&etimer_process, NULL); process_start(&dbgs_process, NULL); process_start(&leds_process, NULL); while (1) { do { } while (process_run() > 0); } } 最新进展,已经移植好 cfs-coffee 文件系统啦 简单测试了一下,每隔 5s 读取一次文件内容,这个文件系统虽然小,性能还是很不错的,算是 micro 日志型文件系统支持垃圾回收等 147 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 /** * brief cfs_first * note CFS 初次使用 * param None * retval None */ static void cfs_first(void) { char * str = "www.eeworld.com"; xmem_init(); #if 0 cfs_coffee_format();while(1); #endif int fa = cfs_open( "/index.html", CFS_READ); if (fa < 0) { 148 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 printf("No index.html file found, creating index.html!\r\n"); printf("Formatting FLASH file system for coffee...\r\n"); cfs_coffee_format(); printf("Done!\r\n"); fa = cfs_open( "/index.html", CFS_WRITE); int w = cfs_write(fa, (char*)str, strlen(str)); if (w < 0) { printf("Can''t create index.html!\r\n"); } cfs_close(fa); } } /** * brief dbgs_process * note dbgs_process * param None * retval None */ PROCESS_THREAD(dbgs_process, ev, data) { char context[128]; static struct etimer et_dbg; PROCESS_BEGIN(); etimer_set(&et_dbg, 5*CLOCK_SECOND); while (1) { PROCESS_WAIT_EVENT(); if (ev == PROCESS_EVENT_TIMER) { int fa = cfs_open( "/index.html", CFS_READ); int r = cfs_read(fa, context, 20); if (r < 0) { printf("Can''t read index.html!\r\n"); } printf("index.html context: %s\r\n", context); cfs_close(fa); etimer_reset(&et_dbg); } } PROCESS_END(); } 继续更新,有点累,搞定 rtime 移植 ,RF 驱动有点复杂,估计还要一个礼拜时间,相关东西可以参 考这个论坛,下面是我搜索 SAMR21 的结果 http://www.avrfreaks.net/search/site/samr21 http://www.avrfreaks.net 149 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 关于 Rtime 移植部分的一些代码 /** * @brief rtimer_arch_init * @note 硬件定时器初始化 * @param none * @retval none */ void rtimer_arch_init(void) { configure_tc(); configure_tc_callbacks(); } /** * @brief rtimer_arch_schedule * @note 硬件定时调度调度 * @param none * @retval none */ void rtimer_arch_schedule(rtimer_clock_t t) { PRINTF("rtimer_arch_schedule time %u\n", t); CONF_TC_MODULE->COUNT32.CC[0].reg = t; } /** * @brief rtimer_arch_now * @note 硬件定时当前时刻 * @param none * @retval none */ rtimer_clock_t rtimer_arch_now(void) { rtimer_clock_t t; t = CONF_TC_MODULE->COUNT32.COUNT.reg; return t; } /** * @brief rtimer_isr_hook * @note 硬件定时器中断勾函数 * @param none * @retval none */ void rtimer_isr_hook(void) { ENERGEST_ON(ENERGEST_TYPE_IRQ); rtimer_run_next(); 150 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 if (process_nevents() > 0) { /* * 退出低功耗 * 如果之前进入了的话 */ } ENERGEST_OFF(ENERGEST_TYPE_IRQ); } 查看详情请点击:http://bbs.eeworld.com.cn/thread-453318-1-1.html 151 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.5.4 设计详解之 6lowpan 网络单播 / 多播测试 好吧,搞了半个月,终于搞定 radio 部分驱动,at86rf233 的数据手册看了不下 3 遍,算是基本通了 大家有关于这个 radio 的问题可以跟帖咨询。 发个图在说话 152 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 这是单播的例子,一个发一个收。多播的比较简单,就不发图了。 一些测试代码,凑合看一下吧,也没啥用处,玩 contiki 的不多 , 发送端 /** * brief unicast_sender_process * note 单播发送处理线程 * param None * retval None */ PROCESS_THREAD(unicast_sender_process, ev, data) { static struct etimer periodic_timer; static struct etimer send_timer; uip_ipaddr_t *addr; PROCESS_BEGIN(); servreg_hack_init(); set_global_address(); simple_udp_register(&unicast_connection, UDP_PORT, NULL, UDP_PORT, receiver); etimer_set(&periodic_timer, SEND_INTERVAL); while(1) { PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&periodic_timer)); etimer_reset(&periodic_timer); etimer_set(&send_timer, SEND_TIME); PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&send_timer)); addr = servreg_hack_lookup(SERVICE_ID); if (addr != NULL) { static unsigned int message_number; char buf[20]; printf("Sending unicast to "); uip_debug_ipaddr_print(addr); printf("\n"); sprintf(buf, "Message %d", message_number); message_number++; simple_udp_sendto(&unicast_connection, buf, strlen(buf) + 1, addr); } else { printf("Service %d not found\n", SERVICE_ID); } } PROCESS_END(); } 发送端接收回调 153 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 /** * brief receiver * note 接收回调函数 * param None * retval None */ static void receiver(struct simple_udp_connection *c, const uip_ipaddr_t *sender_addr, uint16_t sender_port, const uip_ipaddr_t *receiver_addr, uint16_t receiver_port, const uint8_t *data, uint16_t datalen) { printf("Data received on port %d from port %d with length %d\n", receiver_port, sender_port, datalen); printf("Context %s\n", data); } 接收端 /** * brief unicast_receiver_process * note 单播接收处理线程 * param None * retval None */ PROCESS_THREAD(unicast_receiver_process, ev, data) { uip_ipaddr_t *ipaddr; PROCESS_BEGIN(); servreg_hack_init(); ipaddr = set_global_address(); create_rpl_dag(ipaddr); servreg_hack_register(SERVICE_ID, ipaddr); simple_udp_register(&unicast_connection, UDP_PORT, NULL, UDP_PORT, receiver); while(1) { PROCESS_WAIT_EVENT(); } PROCESS_END(); } 154 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 接收端接收回调 /** * brief receiver * note 接收回调函数 * param None * retval None */ static void receiver(struct simple_udp_connection *c, const uip_ipaddr_t *sender_addr, uint16_t sender_port, const uip_ipaddr_t *receiver_addr, uint16_t receiver_port, const uint8_t *data, uint16_t datalen) { printf("Data received from "); uip_debug_ipaddr_print(sender_addr); printf(" on port %d from port %d with length %d: '%s'\n", receiver_port, sender_ port, datalen, data); } 哎,节点太少了,看来要开始买节点了,路由 RPL 没法测试,后面有机会一定玩一下 RIME 目前 支持俩种算法 AODV 啥的,和官网那个 llmesh 使用的算法类似。 详情请查看:http://bbs.eeworld.com.cn/thread-453986-1-1.html 155 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.5.5 设计详解之边界路由器 RPL-BORDER-ROUTER 上周有一些进展,基本上搞定了边界路由器 RPL-BORDER-ROUTER 的移植和一些测试 简单说说什么是边界路由器,可以理解为目前互联网到 6lowpan 的转换网关 / 边界路由 我了解的有两种实现方式: 1)传统的网关,采用以太网 ipv4 到 ipv6 的转换一般有对应的 PNAT 的转换协议 典型的硬件结构:以太网网卡 + 主控芯片 +802.15.4RADIO (比如采用 STM32F107+802.3 PHY + 802.15.4 AT86RF233 等) 2)SLIP 桥接方式,直接采用 SLIP 协议到网关的结构 典型的硬件结构:openwrt 路由器 + 主控 +802.15.4RADIO(比如 openwrt 路由器 /PC USB 接 口直接连接到 Atmel SAM R21 就可以了) 这里我采用的第二种方式,当然为了直观我直接用的 PC 版本的,对已 openwrt 版本不做过多介绍, 相比 pc 还要简单,编译个文件就好了,也可以直接 opkg 安装现成的。 一些测试的图片如下 两个节点的调试信息 156 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 使用边界路由器 ping 节点,两个节点,一个是边界网关,一个是普通节点 BR 守护程序 157 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 详情请查看:http://bbs.eeworld.com.cn/thread-454249-1-1.html 158 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.5.6 设计详解之 RPL Simple-WebServer 恩,前面的帖子基本上已经跑起来基本的网络了,现在应该可以做一些应用了。搞点直观的东西吧, webserver 不得不说还是比较基础的,那就弄一下了。参考开源的 httpd-simple.c 文件 , 一些版权信 息如下 /** * \file * A simple web server forwarding page generation to a protothread * \author * Adam Dunkels * Niclas Finne * Joakim Eriksson */ 硬件连接和节点网络和之前发表的 rpl 边界路由的一致,在边界路由中添加了一个简单的 web,当 然可以添加在其他的节点中,用于控制 / 状态查询等。 这里给出一些测试截图,注意那个单位是 us,这里有些问题,目前已经修改 159 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 测试中使用了 chrome 不能够正常,IE 和 Firefox 都是正常的,顺便说一下如何使用 ipv6 的地址 来访问 webserver 格式如下 http://[IPV6]: 端口 /index.html 我的节点地址是 aaaa::11, 默认端口 80 且没有 index 所以访问按照如下的格式就可以了 http://[aaaa::11] 最后添加一个 IE 访问的截图,已经修改路由存活时间的单位为 us 160 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 查看详情请点击:http://bbs.eeworld.com.cn/thread-454326-1-1.html 161 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.5.7 设计详解之 openwrt 网关准备 开始准备 openwrt 的网关了,没法子,找个路由器开刷啊。不得不说 openwrt 是个不错的开源项 目,想玩 linux 又没板子的朋友可以用自己的路由器开搞啊,基本能做不少东西。当然了关于网络部分 openwrt 还有自己特有的优势,太多的支持了。好了这里我选择的是 tp-link_wr703n 这款路由器,比 较小巧,也很便宜。之前论坛还有送我一个,刚好家里有三个。很久就全刷成 openwrt 了,用起来爽, 搞点 vpn 代理啥的,还真是方便。恩这里随便拿了一个来改造一下,其实可以直接用它的 USB 口扩展 一个串口来用,恩这是最好的方式,也不用破坏路由器的结构,拆机都不要的,你说方便不。不过考虑 到可玩性,后面也许会出现需要用到 uboot 的情况,所以我选择了用芯片出来的 debug 口来作为 slip 的接口也就是我们需要一个串口,任意的都可以。首先需要把串口和电源等引出来,操作过程中的一些 图片。恩,如图的 DDR1 附件的点就是预留的调试接口了,后面可以用这个口子调试也可以用于普通 的用户串口来用,两用的哦。 好了继续折腾,加上外壳子,当然了还需要弄个结实一点的洞洞板子,便于我把 6lowpan 根节点 插上去。 基本上硬件先到这里了,其实我的整个网关都搞定了,一部分一部分的发吧。下面看一些软件的东 西吧,关于烧写的一点点记录,先看下 uboot 和 kernel 烧写过程,用 uboot 烧写的,比较常规的方法 tftp 162 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 163 Atmel SAM R21 优势整合,精“芯”构造 继续看一下 openwrt 启动和 ping 外网测试 Atmel SAM R21 Xplained Pro 实战演练 恩,差不多了,看一下 ipv6 安装的一些依赖 ( 分别使用 lsmod 和 opkg list-installed 命令来看一下, 记住这些依赖最好直接编译到内核中去,否则直接 opkg install 好像有问题的 ) 164 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 165 Atmel SAM R21 优势整合,精“芯”构造 最后看一下网页,原始版本的 Atmel SAM R21 Xplained Pro 实战演练 分享我的内核,已经支持全部的边界网关程序和 ipv6 相关依赖 mod。openwrt-ar71xx-generictl-wr703n-v1-squashfs-sysupgrade_150121.rar 查看详情请点击:http://bbs.eeworld.com.cn/thread-454914-1-1.html 166 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.5.8 设计详解之添加 GPU 好了,很久没更新了,最近在给 R21 添加一款 GPU,这个 GPU 算是项目中接触到的,2013 年 12 月份开始接触,也算是国内玩这颗 IC 比较早的了,去苏州 FTDI 原厂培训过。可惜,没有把这款 IC 很好的应用一下,这里还是想通过这次机会给大家展示一下 FT800 的魅力,目前已经有 FT801 版本了,去 年也在某项目上使用,效果相当给力,电容屏驱动起来,完全不费力,一行 code 都不需要写,这就是 他给力的地方啦。下面看我介绍 FT800,主要参考资料 FTDI 官方和 kickstarter 上的 gameduino-2 (后面简称 GD2)开源项目。又想啰嗦了,不得不说这颗 IC 也算是相当给力的,用过 FTDI 的 USB 相关芯片的都知道的。当然现在 FTDI 也出自己的 MCU 了,8bit 和 32bit 都不错,全部都是私核,很 强。说道 gameduino-2 这个开源项目,玩 arduino 的应该有熟悉的,在这之前还有个 gameduino-1 的项目,当初是为了给 arduino 来驱动 VGA 显示器的,对了就是干这个的,说是 GPU 一点也不为怪, 后面看我分析 FT800 就不得不赞叹设计这颗 IC 的 designer 了。看了一眼 GD-1 中采用的是 xilinx 的 sp3 FPGA 来实现的整个项目,当然还有对应 arduino 的 GD1 库。 不得不说,短短一年时间有了这么多型号,很久没关注了,看了下官网,震惊了。在我之前我仅 仅了解到 FT800 和 FT801 就连 801 还是内部消息,内部样片。两个分辨率都是 480*272,现在的 FT81x 系列都支持 800*600 了。哎,这得内置多少 RAM 啊,在 FT800 中内置 RAM 256K。当然了 关于为何称为是 GPU,我想只有好好的看数据手册,很好的体会一下才好,按照我说不太容易理解, 一句话表达:和我们 PC 的显卡内部的处理方式很一致,很多概念都是直接沿用的。 EVE technology incorporates a wealth of advanced features found in both the FT80X and FT81X series: Targets QVGA/WQVGA displays with 1/16th resolution Maximum screen resolution 800x600 pixels (FT81X), 512x512 pixels (FT80X) 18-bit (FT800, FT801, FT810, FT811) or 24-bit (FT812, FT13)RGB interfaces Multiple palettes supported in 16-bit and 32-bit colours, with transparency Store up to 2000 objects/commands in 8k byte display list Main memory 256K (FT80X) to 1MB (FT81X) FT800/FT810/FT812 with Integrated Resistive Touch Controller; FT801/FT811/FT813 with I2C capacitive touch interface PWM output for programmable display brightness Anti-aliasing algorithms improve display perception Low-power - 24mA typical in active mode Integrated audio synthesizer outputs beeps, tones or recorded audio Support audio playback for PCM, 4bit ADPCM and u-Law coding formats Extended temperature range: -40° C to +85° C 官方的介绍,我简单说明一下,内置的 2000 个对象和命令,直接说就是内置了 GUI 的 widget, 还有很多优秀的功能,关于音频的一些解码,JPEG 的解码,直接加载哦。touch 的 bangding 功能, 直接指定一个 tag 就能够实现触摸的关联处理。还有的就是核心的东西了,时间太长我说不好,就不说 了基本上就是什么 N 级流水线 +display list。 一些官方文档图片,比较直观 167 Atmel SAM R21 优势整合,精“芯”构造 内部结构 Atmel SAM R21 Xplained Pro 实战演练 应用连接 软件结构 168 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 一些官方附件 DS_FT800.pdf EVE Brochure.pdf FT800 Programmers Guide.pdf 点击此处下载附件 好了,说说我的一些准备工作,已经写好基本的驱动基于 Atmel R21 这款 mcu 的,还有一些硬件 准备工作。 169 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 170 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 查看详情请见:http://bbs.eeworld.com.cn/thread-457105-1-1.html 171 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.5.9 设计详解之 GPU 运行 好吧,折腾了一下,基本上还比较顺利,GPU 已经被驱动起来了,关于 GPU 相关的可以参考之 前的帖子。 【Atmel SAM R21 创意大赛周计划】+ 添加 GPU 恩,驱动采用的 SAM R21 Xplained Pro 板子上面的 EXT1 扩展口中的 SPI 接口,SPI 引脚等资 源基本上在 samr21_xplanined_pro.h 文件中已经详细的定义了。 实际中做了一些 HAL 的分层处理,方便后期移植。 /* Defines -------------------------------------------------------------------*/ #define EXT1_SPI_MODULE_BAUDRATE 5000000UL /* Macros --------------------------------------------------------------------*/ #define GPIO_PIN_HIGH(GPIN) port_pin_set_output_level(GPIN, true) #define GPIO_PIN_LOWL(GPIN) port_pin_set_output_level(GPIN, false) #define EXT1_PIN5_HIGH() #define EXT1_PIN5_LOWL() GPIO_PIN_HIGH(EXT1_PIN_5) GPIO_PIN_LOWL(EXT1_PIN_5) 初始化部分,采用库方式,比较简单 /* Includes ------------------------------------------------------------------*/ #include #include /* Global Variables ----------------------------------------------------------*/ struct spi_slave_inst EXT1_SPI_Slaver; struct spi_module EXT1_SPI_Master; /* Global Functions ----------------------------------------------------------*/ /** * @brief EXT1_PIN5_INIT * @note EXT1 PIn5 初始化 * @param none * @retval none */ void EXT1_PIN5_INIT(void) { struct port_config pin_conf; /* 配置 PIN5 作为输出 */ port_get_config_defaults(&pin_conf); pin_conf.direction = PORT_PIN_DIR_OUTPUT; port_pin_set_config(EXT1_PIN_5, &pin_conf); port_pin_set_output_level(EXT1_PIN_5, false); 172 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 } /** * @brief EXT1_SPIS_INIT * @note EXT1_SPI 初始化 * @param none * @retval none */ void EXT1_SPIS_INIT(void) { struct spi_config struct spi_slave_inst_config Config_SPI_Master; Slaver_Dev_Config; /* 配置并初始化从外设软设备实例 */ spi_slave_inst_get_config_defaults(&Slaver_Dev_Config); Slaver_Dev_Config.ss_pin = EXT1_PIN_SPI_SS_0; spi_attach_slave(&EXT1_SPI_Slaver, &Slaver_Dev_Config); /* 配置 / 初始化 / 使能 SERCOM 外设为 SPI 模式 */ spi_get_config_defaults(&Config_SPI_Master); Config_SPI_Master.mux_setting = EXT1_SPI_SERCOM_MUX_SETTING; Config_SPI_Master.mode_specific.master.baudrate = EXT1_SPI_MODULE_BAUDRATE; Config_SPI_Master.pinmux_pad0 = EXT1_SPI_SERCOM_PINMUX_PAD0; Config_SPI_Master.pinmux_pad1 = PINMUX_UNUSED; Config_SPI_Master.pinmux_pad2 = EXT1_SPI_SERCOM_PINMUX_PAD2; Config_SPI_Master.pinmux_pad3 = EXT1_SPI_SERCOM_PINMUX_PAD3; spi_init(&EXT1_SPI_Master, EXT1_SPI_MODULE, &Config_SPI_Master); spi_enable(&EXT1_SPI_Master); } /** * @brief EXT1_SPI_NSS_HIGH * @note EXT1_SPI 片选高 * @param none * @retval none */ void EXT1_SPI_NSS_HIGH(void) { spi_select_slave(&EXT1_SPI_Master, &EXT1_SPI_Slaver, false); } /** * @brief EXT1_SPI_NSS_LOWL * @note EXT1_SPI 片选低 * @param none * @retval none */ void EXT1_SPI_NSS_LOWL(void) 173 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 { spi_select_slave(&EXT1_SPI_Master, &EXT1_SPI_Slaver, true); } /** * @brief EXT1_SPI_WRITE * @note EXT1_SPI 写操作 * @param none * @retval none */ uint8_t EXT1_SPI_WRITE(uint8_t *buff, uint8_t len) { spi_write_buffer_wait(&EXT1_SPI_Master, buff, len); return len; } /** * @brief EXT1_SPI_READD * @note EXT1_SPI 读操作 * @param none * @retval none */ uint8_t EXT1_SPI_READD(uint8_t *buff, uint8_t len) { spi_read_buffer_wait(&EXT1_SPI_Master, buff, len, 8); return len; } 到此基本上就 OK,哎,估计以后要失业,现在跑个 demo 太快了,社会有些浮躁啊,不过 atmel 的库还是很不错的,设计者很用心,认识到位。 然后基本上就是 HAL 层对应 GPU 层的一些宏了。 /* ---------------------------------------------------------------------------*/ /* ---------------------------------------------------------------------------*/ #define FT800_SPI_INIT() EXT1_SPIS_INIT() #define FT800_FDI_INIT() EXT1_PIN5_INIT() #define FT800_SPI_READD(buf, len) #define FT800_SPI_WRITE(buf, len) EXT1_SPI_READD(buf, len) EXT1_SPI_WRITE(buf, len) #define SET_FT800_CS_PIN_LOWL() #define SET_FT800_CS_PIN_HIGH() EXT1_SPI_NSS_LOWL() EXT1_SPI_NSS_HIGH() #define SET_FT800_PD_PIN_LOWL() #define SET_FT800_PD_PIN_HIGH() EXT1_PIN5_LOWL() EXT1_PIN5_HIGH() 174 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 恩,发一些运行的图片吧,视频后面补上,不太好拍,晚上光线不好,手机像素垃圾。。。恩,主 要做了两个东西一个魔方三维的,用于展示 openGL 的特性,另外一个是 ECG,测心率的,数据是模 拟的,仅仅用于演示。 175 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 176 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 177 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 178 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 恩,主要做了两个东西一个魔方三维的,用于展示 openGL 的特性,另外一个是 ECG,测心率的, 数据是模拟的,仅仅用于演示。 查看详情请见:http://bbs.eeworld.com.cn/thread-457213-1-1.html 179 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.5.10 设计详解之 6LoWPAN 之应用层 CoAP 协议 之前在笔记本电脑上测试的边界路由(网关)的性能,直接用笔记本的 wifi 网卡连接边界路由(网 关)测试的,今天在我的台式机器上面做测试的截图工作,发现 ping 丢包特别严重。。折腾了很久, 发现是台式机的 wifi-dongle 的问题,不稳定啊,不晓得为啥。上网都很稳定的,就是连接网关有问题, 可能是 ipv6 等等问题吧,不能深究了,果断换了个有线连接的,还好网关支持 RJ45 接口,拉个网线 解决问题了。 1)先来个边界路由(网关)的图 180 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 2)安装火狐浏览器和 copper 插件(用于 CoAP 协议) 181 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 关于这个插件的一些细节可以参考他的主页介绍。 3)给网关上电,搜索 SSID 为下面所示的,连接即可,如果 wifi 不稳定可以直接用网线连接网关 和电脑 用 iar 管理了一些相关的程序,如上图所示。 182 Atmel SAM R21 优势整合,精“芯”构造 4)节点用移动电源供电 Atmel SAM R21 Xplained Pro 实战演练 183 Atmel SAM R21 优势整合,精“芯”构造 5)网关联通性测试 Atmel SAM R21 Xplained Pro 实战演练 6)6LoWPAN 网络连通性测试 184 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 图为边界路由(网关)内置动态网页,用于打印路由信息和邻居信息,是内建在 R21 内部的网页 而并非是 openwrt 中,wr703 仅仅做数据转换和 IPv6 到 IPv4 的路由宣告服务。 7)CoAP 应用协议测试 185 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 采用 coap://[aaaa::22] 和 coap://[aaaa::33] 的地址访问节点,注意第一次使用 discover 来发现 节点提供的服务。这算是 coap 的一个重要特性,资源发现机制,相当给力的特性。将来物联网肯定都 是这种自动发现的机制。这里选择 hello 之后地址栏数据会发生变化,此后点击 push 按钮之后会接收 到节点传输过来的数据 www.eeworld.com lyzhangxiang 这个也算是一个很给力的特性,消息订阅机制,主要用于异步通信,为了让节点更多的节约能量。 一般的服务机制需要一直保持 alive,这种订阅机制可以使得节点在准备好数据后主动发起通信,而不 是传统的客户端发起通信,例如使用在低功耗传感网络中,那这种订阅机制也是必不可少的。当然了现 在比较主流的 mqtt 也是采用消息的订阅和推送为主体的消息机制,也是物联网的一个很好的东西。 186 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 此处展示的是如何使用 CoAP 协议来控制节点,这里的演示比较简单,用于控制 R21 上面 LED0 的状态。看上面的实物图应该能够看出一个节点的 LED0 是打开一个是关闭的。CoAP 协议能做很多事 情,传输数据,回传数据,订阅数据,发现机制等等。后面我会分享如何使用 CoAP 传输数据到板子 上,当然可这一切都是基于发现机制之后的,并不是随意发送数据,发送的数据都是有意义的,都是根 据发现机制发现到的内容决定的。我对这几个节点都添加了四个服务,分别是 hello、push、toggle、 leds。 查看详情请点击:http://bbs.eeworld.com.cn/thread-457215-1-1.html 187 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 3.5.11 小结 基于 SAM R21 的 6LoWPAN 低功耗网络平台研究 一、6LoWPAN 介绍 1、起因 近年来集成了网络技术、嵌入式技术和传感器技术的低速率无线个域网(LR-WPAN)技术成为了 研究热点。LR-WPAN 是为短距离、低速率、低功耗无线通信而设计的网络,可广泛用于智能家电和 工业控制等领域。IETF 组织于 2004 年 11 月正式成立了 IPv6 overLR-WPAN(简称 6LowPan)工 作组,着手制定基于 IPv6 的低速无线个域网标准,即 IPv6over IEEE 802.15.4,旨在将 IPv6 引入以 IEEE 802.15.4 为底层标准的无线个域网。其出现推动了短距离、低速率、低功耗的无线个人区域网络 的发展。IEEE 802.15.4 是 LR-WPAN 的典型代表,其应用前景非常广阔,以其为基础的研究方兴未艾。 但是,IEEE802 15.4 只规定了物理层 (PHY)和媒体访问控制(MAC)层标准,没有涉及到网络层 以上规范,而 IEEE 802 15.4 设备密度很大,迫切需要实现网络化。同时为了满足不同设备制造商的 设备间的互联和互操作性,需要制定统一的网络层标准。IPv6 以其规模空前的地址空间及开放性,对 LR-WPAN 产生 7 极大的吸引力。 图 1. 典型的 6LoWPAN 拓扑结构 2、技术优势 1)普及性:IP 网络应用广泛,作为下一代互联网核心技术的 IPv6,也在加速其普及的步伐,在低 速无线个域网中使用 IPv6 更易于被接受。 2)适用性:IP 网络协议栈架构受到广泛的认可,低速无线个域网完全可以基于此架构进行简单、 有效地开发。 3)更多地址空间:IPv6 应用于低速无线个域网时,最大亮点就是庞大的地址空间。这恰恰满足了 部署大规模、高密度低速无线个域网设备的需要。 支持无状态自动地址配置:IPv6 中当节点启动时,可以自动读取 MAC 地址,并根据相关规则配置 好所需的 IPv6 地址。这个特性对传感器网络来说,非常具有吸引力,因为在大多数情况下,不可能对 传感器节点配置用户界面,节点必须具备自动配置功能。 4)易接入:低速无线个域网使用 IPv6 技术,更易于接入其他基于 IP 技术的网络及下一代互联网, 使其可以充分利用 IP 网络的技术进行发展。 188 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 5)易开发:目前基于 IPv6 的许多技术已比较成熟,并被广泛接受,针对低速无线个域网的特性对 这些技术进行适当的精简和取舍,可以简化协议开发的过程。 6)开源组织的贡献,google 的 threadgroup、思科的 thingsquare 等都是推动 6LoWPAN 前进 的巨大动力,当然 threadgroup 更具有竞争力,目前的成员数已经达到空前。 图 2.6LoWPAN 技术优势图解 这里不得不提一下 CoAP 和 MQTT 应用层协议,因为如果你不了解这些应用层协议的话你很难理 解 6LoWPAN 到底为何这么先进,举个例子 HTTP 协议,我们在浏览 EEWORLD 或者发表帖子等, 使用的标准协议就是 HTTP 协议,这个协议是互联网工作组 N 年前弄出来的。没有他我想今天 IPv4 的 互联网也不会这么庞大了,一个东西标准化的过程往往是曲折的。 3、小结 CoAP 是类似 http 的一种应用层协议,他不是那么复杂,可以在内存很小的嵌入式设备上运行, 比如在 R21 上运行 CoAP 服务端或者客户端。CoAP 的一些优秀的地方在于他支持以下几种机制。 1)资源发现机制,能够发现节点提供的服务以及服务对应的操作方法,这可以说是未来物联网的 核心之一,如果还需要靠事先定义出控制或者采集协议等那么物联网将永远不会有明天,我们需要一种 通用的应用层协议,可以把节点的服务、能力暴露出来,告诉其他的设备如何去操作他,而不是事先定 义那种传统的私有协议。 2)订阅机制,这会大大改善节点的能量消耗,提供一种异步通信的机制,因为节点可能是一个低 功耗的传感器,仅仅是周期性的采集数据然后通知数据中心,这样传统的同步机制就无法满足,必须要 这种订阅的机制。 3)REST 结构 POST/PUT 机制,类似 HTTP 协议的 POST/PUT 机制。 4)UDP 上的可靠通信机制,通过重传来保证 UDP 可靠通信,同时 UDP 更加适合内存很小的嵌 入式设备。 这里仅仅说了 CoAP 协议,其实其他的协议 http/ftp/email 等都可以被很好的自持,因为节点之间 通信采用的是标准的 ip 报文,所以支持全部的互联网协议。假设我们需要实现一个节点请求雅虎天气服 务器上的天气数据可以采用 http 协议直接获取,这样的应用在 6LoWPAN 中仅仅需要半分钟就能实现, 189 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 不需要过多的代码和任何的协议转换就能实现。 二、threadgroup 1、简介 三 星,谷 歌拥 有的 鸟 巢实 验室, 和其 他 五家 公司 已 经合 作创 建所 谓“ 线程” 小组(Thread Group),将专注于开发用于智能家居的全新无线网络协议。“线程”小组(Thread Group)使用和 Zigbee 相同的频率和射频芯片。 “线程”小组提供了类似的可扩展性和“银行类公共密钥”加密功能,同时,它的最大优点是,它 只是一个软件更新,无需考虑对家庭自动化市场上的众多产品的兼容性。此外,三星参与其开发,“线程” 小组研发的射频芯片,可能会出现在下一代智能手机和平板电脑当中。 2、拓扑 THREAD 说白了本质上就是 6LoWPAN,底层也是 IEEE 802.15.4 MAC+PHY 中间层主要是被 thread 标准化的东西,核心的东西是 UDP+IP 路由 +LoWPAN+ 安全通信 + 应用层协议(主要还是 MQTT/CoAP 协议) 图 3.THREAD 软件拓扑图 3、系统拓扑 THREAD 典型系统拓扑,云服务 + Border-Router + 设备连接,这里的 Border-Router 可以被 称为是边界路由 / 网关等,确切一些被叫做是边界路由器是最适合不过的,其实就是 6LoWPAN 网络 IPv6 与传统 IPv4 网络的数据包转换,仅仅有这一个功能,在我得设计中 openwrt 的路由器就是充当 这个角色,功能也仅仅是 IP 报文 46 转换还有 IPv6 的路由宣告服务。如果是一个传统的设计,那这里 的网关的功能将会相当复杂,需要做很多的协议转换等等,关键是不能一劳永逸,每次都需要修改,细 细体会你能发现 6LoWPAN 的好处。当然了有些地方称边界路由为 EDGE Router,不是很确切,最 190 Atmel SAM R21 优势整合,精“芯”构造 好的就是叫 Border-Router。 Atmel SAM R21 Xplained Pro 实战演练 图 4.THREAD 典型系统拓扑图 4、RFC 文档 这里算是说出了 6LoWPAN 的核心所在了,就是这些互联网工作组的 RFC 文档,可以直接在他们 官方网站下载这些文档,很多文档在很多年前就已经开始起草了,目前基本上已经全部定稿了,算是个 好消息。 图 5.THREAD 概述 RFC 文档 5、网络结构图 这是一种典型的 6LoWPAN 网络通信结构图,就不做过多的介绍了,就一点节点之间通信的报文 全部是基于 IP 的报文,其次网络管理会使用一些 IEEE 802.15.4 的 MAC 命令、信标等。边界路由仅 仅做 IPv4 与 IPv6 之间的转换以及 IPv6 路由宣告服务,无他。 191 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 图 6.THREAD 网络结构图之一 三、Atmel SAM R21 说了这么多关于 6LoWPAN 的东西,主要还是想让大家了解一下 IEEE 802.15.4 的主流应用场 合吧,能干些啥,这个 R21 的 RADIO 部分也算是 Atmel 相当经典的一款产品了 AT86RF233,熟悉 的人会知道这颗 RADIO 的发展是有个过程的,可以说是积累了 ATMEL 几代人的经验和总结的产物, 之前是 AT86RF230 到 AT86RF231 到后来的 AT86RF233,当然了对于 AT86RF233 还有一个特 性也是他人的芯片无法相比的,那就是相差测距引擎,目前市面上所有的 802.15.4 RADIO 芯片仅仅 Atmel 的 AT86RF233 具有这个引擎,大家感兴趣的可以搜索 RTB 这个关键字,还有一篇 ATMEL 研 发人员写的 PPT,详细讲解了相差测距的细节和过程,还是蛮复杂的。目前 atmel 提供这种测距的库, 这种测距方式由于理论基础比较高所以测距的精度很高,在使用正交的天线分集下精度在 5cm 以内, 完全秒杀 RSSI 这种测距方式,RSSI 仅仅是一种距离评估,在我眼里根本算不上是测距吧。由于是家 里的电脑没有这篇 PPT,有感兴趣的可以联系我。 1、IEEE 802.15.4 简介 随着通信技术的迅速发展,人们提出了在人自身附近几米范围之内通信的需求,这样就出现了个人 区域网络(personal area network, PAN)和无线个人区域网络(wireless personal area network, WPAN)的概念。WPAN 网络为近距离范围内的设备建立无线连接,把几米范围内的多个设备通过无 线方式连接在一起,使它们可以相互通信甚至接入 LAN 或 Internet。1998 年 3 月,IEEE 802.15 工 作组。这个工作组致力于 WPAN 网络的物理层(PHY)和媒体访问层(MAC)的标准化工作,目标 是为在个人操作空间(personal operating space, POS)内相互通信的无线通信设备提供通信标准。 POS 一般是指用户附近 10 米左右的空间范围,在这个范围内用户可以是固定的,也可以是移动的。 在 IEEE 802.15 工作组内有四个任务组(task group, TG),分别制定适合不同应用的标准。这些标 准在传输速率、功耗和支持的服务等方面存在差异。下面是四个任务组各自的主要任务: (1)任务组 TG1:制定 IEEE 802.15.1 标准,又称蓝牙无线个人区域网络标准。这是一个中等速率、 近距离的 WPAN 网络标准,通常用于手机、PDA 等设备的短距离通信。 (2)任务组 TG2:制定 IEEE 802.15.2 标准,研究 IEEE 802.15.1 与 IEEE 802.11(无线局域 网标准,WLAN)的共存问题。 192 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 (3)任务组 TG3:制定 IEEE 802.15.3 标准,研究高传输速率无线个人区域网络标准。该标准 主要考虑无线个人区域网络在多媒体方面的应用,追求更高的传输速率与服务品质。 (4) 任 务 组 TG4: 制 定 IEEE 802.15.4 标 准, 针 对 低 速 无 线 个 人 区 域 网 络(low-rate wireless personal area network, LR-WPAN) 制 定 标 准。 该 标 准 把 低 能 量 消 耗、 低 速 率 传 输、 低 成 本 作 为 重 点 目 标, 旨 在 为 个 人 或 者 家 庭 范 围 内 不 同 设 备 之 间 的 低 速 互 连 提 供 统 一 标 准。 任务组 TG4 定义的 LR-WPAN 网络的特征与传感器网络有很多相似之处,很多研究机构把它作为传 感器的通信标准。LR-WPAN 网络是一种结构简单、成本低廉的无线通信网络,它使得在低电能和低 吞吐量的应用环境中使用无线连接成为可能。与 WLAN 相比,LR-WPAN 网络只需很少的基础设施, 甚至不需要基础设施。IEEE 802.15.4 标准为 LR-WPAN 网络制定了物理层和 MAC 子层协议。 2、IEEE 802.15.4 芯片 大家熟悉的 zigbee 就是这种 RADIO 芯片,很多场合大家都是直接称为是 ZigBee 芯片而不是 802.15.4 芯片,在我看来我一直称为是 802.15.4 芯片。因为 zigbee 算是一个组织一个联盟一种协 议,只是对芯片有要求,底层满足 802.15.4 的才可以跑这种协议,所以时间久了大家都习惯称他们为 zigbee 芯片了。对于 6lowpan 而言,他们的底层也是 802.15.4,所以所有的 802.15.4 芯片都是能够 做 6LoWPAN 的应用的,近年来有不少非 802.15.4 的芯片通过软件处理的方式也能够做 6LoWPAN 的应用比如 ti 的 CC1180/CC1120 等,不过从标准中看,建议还是采用标准的 802,15,4 芯片来做会 更加适合,也便于不同厂家互联互通,从 RAIDO 层面上互联互通而不仅仅是协议上。 3、ATSAMR21G18 芯片 典 型 的 R21+AT86RF233 结 构, 在 物 联 网 的 今 天, 这 种 芯 片 定 位 市 场 很 贴 切,SOC 的 zigbee/6lowpan 应用领域,其他的都是不他的菜。zigbee 这个自然有官方开发好的 zigbit 协议栈,可 惜现在 zigbee 还没有做到全部开放,代码部分闭源同时需要 zigbee 联盟授权,如今微软都开始免费了, 要不是这些年被 linux/android 的打击,估计也很难免费了。所以从谷歌收购 nest 后部署 threadgroup 来看未来很可能是 6LowPAN 一统天下。 4、开源 6LoWPAN,Contiki-OS 选择开源的 ContikiOS 作为基础,移植到 R21 上,一些移植过程请参考我之前发布的帖子,不做 细节介绍。ContikiOS 可以说是目前最完善的 6LowPAN 实现,支持的架包也很多,全部在 apps 下面, 举一例子 apps/webbrowser 用于实现节点访问百度等这类任意的网站的一种实现,大家可以想象,我 们能做哪些事情。 5、整体介绍 低功耗网络传感平台,实现了 contiki 在 R21 上的移植,RPL 路由协议的核心内容是 DODAG, 这个我后期再写一点文字出来吧。为了演示,一共使用三个节点,除了边界路由上的跟路由节点以外, 另外两个节点既是终端又是路由,网络本身是一种典型的树型拓扑结构。跟路由节点功能主要实现的是 通过 slip 网桥连接到 openwrt 路由器的串口上,在 openwrt 而言这个跟节点是一个虚拟网卡,会把虚 拟网卡的数据转发到本地 LAN 接口上,在将本地 LAN 桥接到 WLAN 上,实现通过路由器 WIFI 或者 RJ45 来访问到 R21,这里 R21 需要运行 slip 协议,slip 与 6lowpan 有接口可以回调,实现了数据很 好的交互。根路由节点 R21 充当 ROOT,通过网络配置的地址前缀来组建网络,期间核心的东西 RPL 的 DODAG 有向无环图,负责邻居的发现路由的建立等。同时在跟路由节点的 R21 中运行 simple- 193 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 http 协议,实现一个精简的 web 服务,用于打印路由表和邻居信息。跟路由节点的地址是 aaaa::11 图 7. R21 内置的精简动态网页 其他的两个 R21 节点的地址分别 aaaa::22、aaaa::33,且两个节点中都添加了 CoAP 的服务和 客户端,主要展示了一些 CoAP 的特性,同时为了展示 6LoWPAN 网络的组建过程和 CoAP 的通信演 示,给其中一个节点添加了 GPU,该 GPU 仅仅用于绘制图形,本身没有控制器也没有程序或者固件, 整个的程序都被包含在 R21 中,主要是使用 R21 的 SPI 接口,一些细节可参看我发布的带 GPU 关键 字的帖子。 我想很多细节的东西,不好用文字来表达清楚,因为 6LoWPAN 本身涉及的技术领域比较大,知 识面也蛮多的,也需要更多的互联网思维,而不要局限于传统的协议。大家可以看我的视频,在录制 的过程中特地配了一下音,便于观看者理解。这篇文章就写这么多了,权当让大家对 6LoWPAN 和 SAM R21 有更深入的理解和体会,后期如果有可能我想继续发掘一下 R21 的 RADIO 的相差测距的 特性,当然 R21 RADIO 的驱动我至少花了 1 个月时间来研究学习,给大家一些建议,Atmel 官方有 个 AT86RF212 的中文手册,建议对着这个文档来开发 RADIO 的驱动,因为 212 和 233 还是有蛮多 相似之处的。当然了 AT86RF233 的手册才是主要的,前前后后看了两三遍,Atmel 的文档写的不错, 学习到了一些除了 IC 以外的知识,这里表示感谢。大家有对 R21 RADIO 驱动部分有疑问的欢迎大家 在本帖中跟帖说明,我会尽力帮助大家。 关于 AT86RF2xx 的题外话 194 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 图 8.IEEE 802.15.4 扩展运行模式 图 9.IEEE 802.15.4 帧结构 图 10. 帧滤波器 AT86RF212 的模块已经做好了,780M 的 zigbee 模块,呵呵应该是 802.15.4 模块。 查看详情请见:http://bbs.eeworld.com.cn/thread-458149-1-1.html 195 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 附录一 关于 Atmel SAM R21 Xplained 的相关资源 开发板官方网站 Atmel SAM R21 Xplained Pro 用户指南 Atmel SAM R21 介绍 Atmel IEEE 802.15.4 解决方案 开发软件 Lightweight Mesh Software Stack v1.2.1 Atmel Studio Atmel Software Framework 196 Atmel SAM R21 优势整合,精“芯”构造 Atmel SAM R21 Xplained Pro 实战演练 附录二 鸣谢及版权声明 鸣谢 在此鸣谢: EEWORLD 坛友们积极参与活动,继而产生了许多有趣又实用的评测心得、DIY 设计,为广大电 子工程师了解、使用 Atmel R 系列 MCU 提供了诸多有益的参考。 Atmel 公司的支持。 希望每一个读过此书的人都能有所收获,并将学习、分享的精神传递下去。 EEWORLD 社区 2015.5.25 版权声明 1、《与Atmel D21/R21 相遇、相识、相知(下)——Atmel SAM R21 Xplained Pro 开发板实战演 练 》内容来于EEWORLD 论坛(http://bbs.eeworld.com.cn),系坛友们参与Atmel SAM R21 开发板 无线设计大赛活动产生的内容。由于本书内容乃坛友们自主提供,Atmel尊重坛友意见的相互分享,对于 本书内容的真实、正确性不承担任何责任。 2、《与Atmel D21/R21 相遇、相识、相知(下)——Atmel SAM R21 Xplained Pro 开发板实战演 练》著作权属Atmel 和EEWORLD 共同拥有。 3、本着开源思想,我们授权任何对Atmel SAM R21 MCU 以及开发板有兴趣的工程师免费下载、 复制、传播该书。 4、用于商业用途须经Atmel 和EEWORLD 书面同意。 197 Atmel SAM R21 优势整合,精“芯”构造

Top_arrow
回到顶部
EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。