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; }
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 for GDO0 to be set -> sync transmitted wait_int(RT_TRUE); // Wait for GDO0 to be cleared -> end of packet wait_int(RT_FALSE); write_cc1101(CCxxx0_SFTX,RT_NULL,0,TYPE_STROBE_STATUS); }
int main(int argc, char **argv) { int fd, res; assert(argc>1); fd = open(argv[1], O_RDWR); assert(fd >= 0); assert(ioctl(fd, I2C_SLAVE, SLAVE_ADDR) >= 0); as3935_init(fd); dump_regs(fd, NULL); if(argc>2) { uint8_t *wrbuf=alloca(argc-2); int i; printf("write: "); for(i=2;i<argc;i++) { wrbuf[i-2]=strtoul(argv[i],NULL,0)&0xff; printf("0x%02x ",wrbuf[i-2]); } printf("\n"); res = write(fd, wrbuf, argc-2); assert(res == (argc-2)); dump_regs(fd, NULL); } else { while(1) { uint8_t ints; time_t now; wait_int(fd); usleep(2000); as3935_rreg(fd, 3, &ints); now = time(NULL); printf("%sints: %x / ",ctime(&now),ints&15); ints&=13; if(ints) { as3935_t regs; #ifdef MASK_DISTURBER //if((ints&13) == 4) continue; #endif if(ints&1) printf("noise level too high:\n"); if(ints&4) printf("disturber detected:\n"); if(ints&8) printf("lightning:\n"); dump_regs(fd, ®s); } // ints } // while(1) } close(fd); 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"); }
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; } }