点对点通信

上传人:公**** 文档编号:499191481 上传时间:2022-10-12 格式:DOCX 页数:13 大小:27.89KB
返回 下载 相关 举报
点对点通信_第1页
第1页 / 共13页
点对点通信_第2页
第2页 / 共13页
点对点通信_第3页
第3页 / 共13页
点对点通信_第4页
第4页 / 共13页
点对点通信_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《点对点通信》由会员分享,可在线阅读,更多相关《点对点通信(13页珍藏版)》请在金锄头文库上搜索。

1、/*Filename: spp.cTarget: cc2430Revised: 16/12-2005Revision: 1.0*/#include #include cul.h#include / protosvoid rxCallBack(void); /*接收回调函数*/void ackTimeout(void); /*应答超时函数*/BOOL ackReceived(BYTE sourceAddress); /*应答接收函数*/void sendAck(SPP_RX_STRUCT* receivedPacket); /*应答发送函数*/void waitForAck(void); /*等

2、待应答函数*/static DMA_DESC* dmaTx; / pointer to the DMA descriptor for transmit.static DMA_DESC* dmaRx;/ pointer to the DMA descriptor for receive.static BYTE dmaNumberTx = 0;/ number indicating which DMA channel is used for transmit.static BYTE dmaNumberRx = 0;/ number indicating which DMA channel is u

3、sed for receive.static BYTE myAddress;volatile BYTE sppRxStatus = 0; /spp 接收状态volatile BYTE sppTxStatus = 0; /spp 发送状态 static BYTE pAckBuffer7;static SPP_TX_STRUCT* pAckData;static volatile UINT8 retransmissionCounter; /重发的次数static UINT8 ackTimerNumber;static FUNCTION* rxCallBackFunction;/ See cul.h

4、 for a description of this function./*This function is used to set a user-specified call-back functionto be run when a correct packet addressed for me is received.*/设置用户指定的回调函数,在接收到一个正确的数据包时运行 /通过这个函数可以用程序来改变正确接收数据包后的动作。/callBackFunction 用户指定的函数 /rxCallBackFunction 指向 FUNCTION 的全局变量指针变量 void sppSetR

5、xCallBackFunction(FUNCTION* callBackFunction) rxCallBackFunction = callBackFunction;/ Ends sppSetRxCallBackFunction() /发送应答/SPP_RX_STRUCT 定义在 cul.h/SFR( RFD , 0xD9 ) / RFD: RF Data 定义在 ioCC2430.h/ myAddress 全局变量/ ACK cul.h 中宏定义/ ISTXON hal.h 中宏定义/ srcAddress 源地址void sendAck(SPP_RX_STRUCT* receivedPa

6、cket) /发送应答函数RFD = SPP_HEADER_AND_FOOTER_LENGTH + SPP_ACK_LENGTH;RFD = receivedPacket-srcAddress; /源地址RFD = myAddress;/目的地址RFD = ACK;RFD = 0;RFIF &= IRQ_TXDONE;ISTXON; /RFST = 0xE3;while(!(RFIF & IRQ_TXDONE);return;/ void rxCallBack(.)/ Description:/ This function is called by the interrupt routine

7、when the Rx DMA channel/ finishes the data transfer. The received packets destination address/ is checked. If not addressed to this node, or if the CRC value is not/correct, the packet is erased. An ACK is sent if the packet/tells to. A user defined callback function may is run if set (set/ with set

8、RxCallBackFunction()在Rx DAM通道完成数据传输后由中断程序调用。检査接收包掉的目的地址,如果地址不是 这个节点的,或CRC值是错误的,数据包将被擦除。如果数据包被告知将发送一个应答。/一个用户定义的回调函数可以运行如果定义了的话。/ Arguments:/ void/ Return value:/ void/#define RXFIFOCNT XREG( 0xDF53 ) /* Receive FIFO Count 定义在 ioCC2430.h/ ISFLUSHRX 清 RX FIFO 命令滤波. hal.h 命令滤波中定义/ GET_DMA_DEST(dmaRx) h

9、al.h 中的宏定义,取得一个 DMA 通道的目标地址/ static DMA_DESC* dmaRx指向设备DMA描述符的指针,全局变量DMA_DESC DMA配置结构。/* param SPP_TX_STRUCT* pPacketPointer/Pointer to the struct containing the transfer data.void rxCallBack(void)SPP_RX_STRUCT _xdata* receivedPacket;BYTE res = FALSE;if(RXFIFOCNT 0)/Receive FIFO CountISFLUSHRX; /清 R

10、X FIFO 命令滤波ISFLUSHRX;/Investigating the received packet检验接收数据包/ Checking the destination address and that the CRC is OK./ The message is ACKed if it tells to./CRC :循环冗余码校验receivedPacket = (SPP_RX_STRUCT _xdata*) GET_DMA_DEST(dmaRx);(指针)指向 DMA 通 道目标地址(DMA数据描述结构体)receivedPacket-payloadLength = receive

11、dPacket-payloadLength-SPP_HEADER_AND_FOOTER_LENGTH; /减去头和尾长度if(receivedPacket-destAddress = myAddress) | (receivedPacket-destAddress =BROADCAST_ADDRESS) /数据包目的地是本节点地址或广播地址if(receivedPacket-payloadreceivedPacket-payloadLength+1 & 0x80) /CRC 正确,注意前面 已经减去头尾长度了if(receivedPacket-flags = ACK) /收到了应答包res =

12、 ackReceived(receivedPacket-srcAddress);else/收到普通数据包sppRxStatus = PACKET_RECEIVED; /ssp 接收状态=收到数据包res = TRUE;if(receivedPacket-flags & DO_ACK) /要求收到后发应答sendAck(receivedPacket); /发应答sppRxStatus = RX_COMPLETE; /ssp 接收状态=接收完成if(rxCallBackFunction)rxCallBackFunction(); /调用用户指定回调函数if(res = FALSE) /函数一开始r

13、es=FALSE,如果接收成功则上面程序改变/res值,那这里ifO语句就是接收不成功的时候,那接下来就清空RX FIFO,重置DMA通道等待接收数据。ISFLUSHRX; /清 RX FIFOISFLUSHRX;/ rearming DMA channelDMA_ARM_CHANNEL(dmaNumberRx);RFIM |= IRQ_SFD; sppRxStatus = RX_WAIT; /接收等待return; / ends rxCallBack/ void ackTimeout(.)/ Description:/This function resends a packet if it

14、is not ACKed by the recipient/within _ACK_TIMEOUT_ m-seconds. The message is resent _ACK_RETRIES_ times./ If the message remains un-ACKed, transmission is aborted and spp TX/ status is set to DEST_UNREACHABLE./如果没有收到接收器返回的应答,将重新发送数据包/ Arguments:/ void/ Return value:/ void/ TIMER4_RUN() 宏函数在 hal.h 中定义/ #define ACK_RETRIES 3 在 hal.h 中的宏定义常数void ackTimeout(void) /*(未接收到应答,则在限定次数内重发数据包)*/culTimer4AdmClear(ackTimerNumber);if(pAckData != NULL) /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号