Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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);
}
Exemplo n.º 3
0
Arquivo: main.c Projeto: znuh/unsorted
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, &regs);
			
			} // ints
		} // while(1)
	}
	
	close(fd);
	
	return 0;
}
Exemplo n.º 4
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");
}
Exemplo n.º 5
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;
    }
}