CC2500之数据包传输基本方式(Packet Transmission Basics)-翻译
[复制链接]
数据包传输基本方式 By fxw451 1. 前言 cc2500支持内部硬件数据包处理机制,这就更容易的利用无线协议程序来传输数据。然而,它有时很难确认对特定的应用程序实现哪些功能,这种设计文档研究数据包的大小是如何会影响到程序的复杂性,如何以及何时使用不同长度的配置。 2. 数据包大小 它可以发生任意长度的数据包,但是当数据包超过64位(FIFO的大小)时,增大了数据传输的复杂性。除了16位的CRC外,数据包包括同步字节在内的所有字节
起始位 | 16/32字节同步字 | 8字节数据长度 | 8字节数据地址 | 8×n字节数据 | 16为的CRC校验位 说明:在TX时自动插入,在RX时自动除去;在TX时用户可选择输入部分,在RX时处理但不会删除;为处理用户数据,除了FEC和白化。 数据包发送模式支持三种不同的数据包长度模式:固定,可变和无穷大,在固定长度数据包模式下,PKTLEN寄存器确定数据长度。例如当PKTLEN = 0x05时,10个字节数据写到TX FIFO,只有5个数据被传输,在接收端在检测到有效同步字后会有5个数据被接受。对可变数据模式,在TX下,PKTLEN寄存器没有什么意义,然而在RX下,它将规定最大数据包长度,例如当PKTLEN = 0x05时,在接受到大于5个有效同步字后丢弃数据包。 2.1 数据包大小<=64个字节 只要数据包不超过64个字节,接受和发送数据就很容易,传送一个数据只要把数据送给TX FIFO,然后出发TX,等待数据传输就可以了。在接收端,在读取FIFO数据之前,他在等待接受整个数据包。固定和可变就是这样工作的。
//--------------------------------- // TX (IOCFG0 = 0x06) halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, sizeof(txBuffer)); halSpiStrobe(CCxxx0_STX); // Wait for GDO0 to be set -> sync transmitted while (!P0_6); // Wait for GDO0 to be cleared -> end of packet while (P0_6); //--------------------------------------------- // RX (IOCFG0 = 0x06) halSpiStrobe(CCxxx0_SRX); // Wait for GDO0 to be set -> sync received while (!P0_6); // Wait for GDO0 to be cleared -> end of packet while (P0_6); length = halSpiReadByte(CCxxx0_RXFIFO); halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, length);
要知道即使数据包的大小是64个字节,数据字段的大小将取决于寄存器设置(比如地址滤波,附加状态)
2.2 数据包大小<=255时 这也是完全可能来发送和接受多达255个字节的数据包,但是程序变得有点复杂,在TX中需要重新填充TX FIFO,同样在RX中需要重新读取RX FIFO。有两种不同的方式来实现这种功能:一种是在SPI下让MCU配置状态寄存器,另一种是中断驱动解决办法。对于固定和可变均使用。 2.2.1 SPI 配置 在触发TX 或RX,从MISO,TXBYTES ,RXBYTES寄存器获得的状态字节以给定比率(at a given rate)来获得。在TX FIFO有更多的空间来传输更多的字节和在RX FIFO读取更多的数据。 TX: 1.写入64个字节到TX FIFO; 2. 触发 TX; 3.通过检测状态字节或TXBYTES寄存器以给定速率来给TX FIFO可用的空间; 4.当有更多的空间传输数据时,传输给TX FIFO; 5.重复3,4,直到整个数据传完。 RX: 1. 触发RX; 2. 通过检测状态字节或RXBYTES寄存器以给定速率来给RX FIFO可读取的空间; 3.有需要读取是读取到RX FIFO; 4.重复2,3直到数据接收完全。
2.2.2 Interrupt Driven Solution 中断驱动解决方法 在这种情况下,GDO0 和 GDO2对MCU产生中断,在RX时当RX FIFO 接受数据超过 RXFIFO_THR和在TX时当TX FIFO 接受数据超过 TXFIFO_THR时,其中一个引脚产生中断。当在RX同步字已经收到和整个数据包已经传输完成时和在TX数据包已经传输完成时,另一个引脚产生中断。Link2例子实现一个中断驱动的解决方案,可以在TI 网站 ([1])上找到。 2.3数据包大小>255 当你一直想发送和接受数据(适用于所有的数据包长度或少于255个)时,采用无限长度数据包模式可以实现你的目的。在这种情况下,在芯片不知道数据包长度的情况下它不可能在TX自动生成的CRC或在RX处理CRC。然而在发送和接受数据超过255个字节情况下,无限长度数据包模式显得比固定模式更有优势,并能自动CRC插入和处理。 假定传输452个字节数据 设定PKTCTRL0.LENGTH_CONFIG = 2 (10)(无限长度数据包模式) Pre-program the PKTLEN register to mod(452,256) = 196. 设定PKTLEN寄存器:(452,256) = 196 传输不少于197个字节(少于256个字节剩余传输) Set PKTCTRL0.LENGTH_CONFIG = 0 (00) (Fixed packet length). 当计数器达到196数据包传输完毕,共452个字节传输。 *这部分看程序看不明白,看图可以看明白。
先传输196个字节,让后在传输256个字节,共452字节。
无限长度数据包模式采用SPI 模式(SPI polling不清楚怎么翻译更好)或中断驱动解决方式来实现,所有涉及到的例子都在CC1100/CC1150DK & CC2500/CC2550DK Development Kit Examples and Libraries User Manual ([2])中,如果使用地址滤波PKTCTRL1.ADR_CHK = 1, 2, 或 3,接收到的地址与接收地址相匹配。0xFF 写入到 RX FIFO,通过地址字节,然后是负载数据。 3 勘误表 当使用SPI模式,注意在SPI时钟域和内部26 MHz时钟域之间存在一个影响同步机制的bug,在寄存器值在更新数据时读取了不正确的数据。但也必须注意对于两种方式(SPI polling and interrupt driven)必须确保整个数据包已收到之前,RX FIFO是从不为空(在RX FIFO剩下1个字节),请查阅[3], [4], [5], [6], [7], and [8]。 4 参考文献 [1] CC1100 CC2500 Examples Libraries (swrc021.zip) [2] CC1100/CC1150DK & CC2500/CC2550DK Development Kit Examples & Libraries User Manual (swru109.pdf) [3] CC1100 Errata Notes (swrz012.pdf) [4] CC1100E Errata Notes (swrz029.pdf) [5] CC1101 Errata Note (swrz020.pdf) [6] CC1150 Errata Notes (swrz018.pdf) [7] CC2500 Errata Notes (swrz002.pdf) [8] CC2550 Errata Notes (swrz011.pdf)
第一次自己翻译,难免有错误之处,忘大家指教!!有翻译错误的地方尽管提出。谢谢大家提出宝贵的意见
2011-3-20 晚20:17完成初稿
[ 本帖最后由 fxw451 于 2011-3-20 22:43 编辑 ]
|