uint8_t cc1101_rcv_packet(uint8_t *rxBuffer, uint8_t *length) { #if 0 uint8_t marc=read_cc1101(CCxxx0_MARCSTATE,RT_NULL,0,TYPE_REG)&0x1f; DEBUG("marc %x\r\n",marc); if(marc==0x11) { write_cc1101(CCxxx0_SIDLE,RT_NULL,0,TYPE_STROBE_STATUS); // Enter IDLE state write_cc1101(CCxxx0_SFRX,RT_NULL,0,TYPE_STROBE_STATUS); // Flush Tx FIFO } else{ marc=read_cc1101(CCxxx0_RXBYTES,RT_NULL,0,TYPE_REG)&0x7f; DEBUG("rxbytes %x\r\n",marc); if(marc!=0) { DEBUG("read %d bytes\r\n",read_cc1101(CCxxx0_RXBYTES,RT_NULL,0,TYPE_REG)&0x7f); *length=read_cc1101(CCxxx0_RXFIFO,RT_NULL,0,TYPE_STROBE_STATUS); read_cc1101(CCxxx0_RXFIFO, rxBuffer, *length,TYPE_BURST); } } return *length; #endif uint8_t i,status[2]; write_cc1101(CCxxx0_SRX,RT_NULL,0,TYPE_STROBE_STATUS); wait_int(RT_TRUE); wait_int(RT_FALSE); uint8_t marc=read_cc1101(CCxxx0_RXBYTES,RT_NULL,0,TYPE_REG)&0x7f; //DEBUG("rxbytes %x\r\n",marc); if(marc!=0) { uint8_t len=read_cc1101(CCxxx0_RXFIFO,RT_NULL,0,TYPE_STROBE_STATUS); DEBUG("len is %d\r\n",len); if(len<=*length) { read_cc1101(CCxxx0_RXFIFO, rxBuffer, len,TYPE_BURST); for(i=0;i<len;i++) DEBUG("%x ",rxBuffer[i]); DEBUG("cc1101 receive ok\r\n"); *length=len; read_cc1101(CCxxx0_RXFIFO,status,2,TYPE_BURST); return status[1]&CRC_OK; } else { *length=len; write_cc1101(CCxxx0_SIDLE,RT_NULL,0,TYPE_STROBE_STATUS); // Enter IDLE state write_cc1101(CCxxx0_SFRX,RT_NULL,0,TYPE_STROBE_STATUS); } } return 0; }
uint8_t cc1101_rcv_packet(uint8_t *rxBuffer, uint8_t *length) { uint8_t status[2]; uint8_t packetLength; uint8_t i=(*length)*4; // 具体多少要根据datarate和length来决定 write_cc1101(CCxxx0_SRX,RT_NULL,0,TYPE_STROBE_STATUS); //进入接收状态 wait_int(RT_FALSE); if ((read_cc1101(CCxxx0_RXBYTES,RT_NULL,0,TYPE_STROBE_STATUS) & BYTES_IN_RXFIFO)) //如果接的字节数不为0 { packetLength = read_cc1101(CCxxx0_RXFIFO,RT_NULL,0,TYPE_STROBE_STATUS);//读出第一个字节,此字节为该帧数据长度 if (packetLength <= *length) //如果所要的有效数据长度小于等于接收到的数据包的长度 { read_cc1101(CCxxx0_RXFIFO, rxBuffer, packetLength,TYPE_BURST); //读出所有接收到的数据 *length = packetLength; //把接收数据长度的修改为当前数据的长度 // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI) read_cc1101(CCxxx0_RXFIFO, status, 2,TYPE_BURST); //读出CRC校验位 write_cc1101(CCxxx0_SFRX,RT_NULL,0,TYPE_STROBE_STATUS); //清洗接收缓冲区 DEBUG("cc1101 read \r\n"); for(i=0;i<*length;i++) DEBUG("%x ",rxBuffer[i]); write_cc1101(CCxxx0_STX,RT_NULL,0,TYPE_STROBE_STATUS); return (status[1] & CRC_OK); //如果校验成功返回接收成功 } else { *length = packetLength; write_cc1101(CCxxx0_SFRX,RT_NULL,0,TYPE_STROBE_STATUS); //清洗接收缓冲区 DEBUG("rx buffer is not enough ,need %d bytes\r\n",packetLength); write_cc1101(CCxxx0_STX,RT_NULL,0,TYPE_STROBE_STATUS); return 0; } } else { write_cc1101(CCxxx0_STX,RT_NULL,0,TYPE_STROBE_STATUS); return 0; } }
void cc1101_send_packet(uint8_t *txBuffer, uint8_t size) { int i; DEBUG("cc1101 write \r\n"); for(i=0;i<size;i++) DEBUG("%x ",txBuffer[i]); write_cc1101(CCxxx0_TXFIFO, &size,1,TYPE_REG); write_cc1101(CCxxx0_TXFIFO, txBuffer, size,TYPE_BURST); write_cc1101(CCxxx0_STX,RT_NULL,0,TYPE_STROBE_STATUS); wait_int(RT_TRUE); wait_int(RT_FALSE); //rt_thread_delay(1); write_cc1101(CCxxx0_SRX,RT_NULL,0,TYPE_STROBE_STATUS); if((read_cc1101(CCxxx0_TXBYTES,RT_NULL,0,TYPE_REG)&0x7f)==0) { rt_kprintf("cc1101 send ok\r\n"); return ; } rt_kprintf("cc1101 send failed 2\r\n"); }
void cc1101_read_reg(uint8_t reg) { uint8_t val=read_cc1101(reg, RT_NULL, 0,2); DEBUG("reg %x , val is %x\r\n",reg,val); }