Могу неким промежуточным вариантом, так как окончательный искать надо. Вроде бы вполне рабочий. Можно раскомментировать DEBUG - тогда будет выводить некоторую отладочную информацию в последовательный порт.
//#define DEBUG //enable or disable debugging on serial port 38400 8n1
#define DEVICE_ID 1 //Device ID, uint8_t
#define INTERVAL 15 //sensor update interval
#define RF_CHANNEL 70 //channel number 0-126
#define RF_AUTOACK //Enable or disable autoAck
#define RF_DATARATE DR_1M //data rate - DR_250K, DR_1M or DR_2M
#define RF_RETRDELAY 10 //autoretries delay in 250mkSeconds
#define RF_RETRCOUNT 10 //autoRetries count
#define RF_CRC CRC16 //CRC - CRC8, CRC16 or OFF
#define RF_ADDR0 0xAA
#define RF_ADDR1 0x0E
#define RF_ADDR2 0x0E
#define RF_ADDR3 0x0E
#define RF_ADDR4 0x0E
#include <stdint.h>
#include <stdio.h>
#include "delay.h"
#include "gpio.h"
#include "rf.h"
#include "watchdog.h"
#include "pwr_clk_mgmt.h"
#include "rtc2.h"
#ifdef DEBUG
#include "uart_int.h"
#include "uart.h"
#endif
#define _BV(bit) (1 << (bit))
#define RF_DR_LOW 5
#define RF_DR_HIGH 3
#define RF_EN_CRC 3
#define RF_CRCO 2
#define PWR_UP 1
#define RF_PWR_LOW 1
#define RF_PWR_HIGH 2
#define RF_ERX_P0 0
#define WD_SAFE watchdog_calc_timeout_from_sec(5)
#define LEDPIN GPIO_PIN_ID_P0_0
#define DHTPIN GPIO_PIN_ID_P1_4
uint8_t datadht[5];
uint8_t dhtread () {
uint8_t j = 0, i = 0;
datadht[0] = datadht[1] = datadht[2] = datadht[3] = datadht[4] = 0;
gpio_pin_configure(DHTPIN, GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT);
delay_ms(18);
gpio_pin_val_set(DHTPIN);
gpio_pin_configure(DHTPIN,GPIO_PIN_CONFIG_OPTION_DIR_INPUT);
delay_us(51);
if (gpio_pin_val_read(DHTPIN)) return 0;
delay_us(81);
if (!gpio_pin_val_read(DHTPIN)) return 0;
while (gpio_pin_val_read(DHTPIN));
for (j=0; j<5; j++) {
datadht[j]=0;
for(i=0; i<8; i++) {
while (!gpio_pin_val_read(DHTPIN));
delay_us (30);
if (gpio_pin_val_read(DHTPIN))
datadht[j]|=1<<(7-i);
while (gpio_pin_val_read(DHTPIN));
}
}
return 1;
}
void main() {
uint8_t tmp,pipeAddr[5];
__xdata __at(0x0100) uint8_t sleepCnt;
__xdata __at(0x0101) unsigned long pktCnt;
struct rfPacket_t {
uint8_t deviceId;
uint8_t powerLow;
int errorCode;
unsigned long packetCount;
float temp;
float hum;
} rfPacket;
#ifdef DEBUG
uint8_t tmpVal=0, tmpArr[5];
#endif
pwr_clk_mgmt_open_retention_latches();
watchdog_setup();
watchdog_set_wdsv_count(WD_SAFE);
rtc2_configure(RTC2_CONFIG_OPTION_COMPARE_MODE_0_RESET_AT_IRQ ,65535); //65535=2 сек, 32767=1 сек
pwr_clk_mgmt_wakeup_sources_configure(PWR_CLK_MGMT_WAKEUP_CONFIG_OPTION_WAKEUP_ON_RTC2_TICK_ALWAYS);
pwr_clk_mgmt_pwr_failure_configure(PWR_CLK_MGMT_PWR_FAILURE_CONFIG_OPTION_POF_ENABLE|PWR_CLK_MGMT_PWR_FAILURE_CONFIG_OPTION_POF_THRESHOLD_2_3V);
interrupt_control_global_enable();
#ifdef DEBUG
uart_int_init();
uart_rx_disable();
#endif
if ((PWRDWN&0x7)==0x3) {
#ifdef DEBUG
printf("\n**** Waked up, cycle #%d\n",sleepCnt);
delay_ms(7);
printf("PWRDWN=0x%02X\n",PWRDWN);
printf("RSTREAS=0x%02X\n",RSTREAS);
delay_ms(10);
#endif
PWRDWN=0x0;
RSTREAS=0x0;
if (sleepCnt<(INTERVAL/2)) {
sleepCnt++;
#ifdef DEBUG
puts("Will sleep again");
delay_ms(5);
#endif
rtc2_run();
watchdog_set_wdsv_count(WD_SAFE);
pwr_clk_mgmt_close_retention_latches();
pwr_clk_mgmt_enter_pwr_mode_memory_ret_tmr_on();
}
rfPacket.packetCount=++pktCnt;
} else {
#ifdef DEBUG
puts("\n**** Started up");
printf("PWRDWN=0x%02X\n",PWRDWN);
printf("RSTREAS=0x%02X\n",RSTREAS);
delay_ms(14);
#endif
pktCnt=0;
rfPacket.packetCount=0;
}
#ifdef DEBUG
gpio_pin_configure(LEDPIN,
GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT |
GPIO_PIN_CONFIG_OPTION_OUTPUT_VAL_CLEAR |
GPIO_PIN_CONFIG_OPTION_PIN_MODE_OUTPUT_BUFFER_NORMAL_DRIVE_STRENGTH);
gpio_pin_val_set(LEDPIN);
#endif
rfPacket.deviceId=DEVICE_ID;
rfPacket.packetCount=0;
rfPacket.temp=0;
rfPacket.hum=0;
if (pwr_clk_mgmt_was_prev_reset_watchdog(pwr_clk_mgmt_get_reset_reason())) rfPacket.errorCode=128; else rfPacket.errorCode=0;
RSTREAS=0x0;
rf_spi_configure_enable();
tmp=16*RF_RETRDELAY+RF_RETRCOUNT;
rf_write_register(RF_SETUP_RETR,&tmp,1);
tmp=RF_CHANNEL;
rf_write_register(RF_RF_CH,&tmp,1);
rf_read_register(RF_RF_SETUP,&tmp,1);
#if RF_DATARATE==DR_250k
tmp|=_BV(RF_DR_LOW);
#elif RF_DATARATE==DR_1M
tmp&= ~(_BV(RF_DR_LOW)|_BV(RF_DR_HIGH));
#else
tmp |=_BV(RF_DR_HIGH);
#endif
tmp&=~(_BV(RF_PWR_LOW)|_BV(RF_PWR_HIGH));
#if RF_POWER==MAX
tmp|=(3<<RF_PWR_LOW);
#elif RF_POWER==HIGH
tmp|=(2<<RF_PWR_LOW);
#elif RF_POWER==LOW
tmp|=(1<<RF_PWR_LOW);
#endif
rf_write_register(RF_RF_SETUP,&tmp,1);
#ifdef RF_AUTOACK
tmp=63;
#else
tmp=0;
#endif
rf_write_register(RF_EN_AA,&tmp,1);
rf_read_register(RF_CONFIG,&tmp,1);
tmp&=~(_BV(RF_CRCO)|_BV(RF_EN_CRC));
#if RF_CRC==CRC8
tmp|=_BV(RF_EN_CRC);
#elif RF_CRC==CRC16
tmp|=(_BV(RF_EN_CRC)|_BV(RF_CRCO));
#endif
rf_write_register(RF_CONFIG,&tmp,1);
pipeAddr[0]=RF_ADDR0;
pipeAddr[1]=RF_ADDR1;
pipeAddr[2]=RF_ADDR2;
pipeAddr[3]=RF_ADDR3;
pipeAddr[4]=RF_ADDR4;
tmp=32;
rf_write_register(RF_RX_ADDR_P0,pipeAddr,5);
rf_write_register(RF_TX_ADDR,pipeAddr,5);
rf_write_register(RF_RX_PW_P0,&tmp,1);
rf_power_up(false);
rf_set_as_tx();
delay_us(150);
#ifdef DEBUG
puts("RF register dump:");
delay_ms(5);
for(tmp=0;tmp<=0x17;tmp++) {
if ((tmp!=RF_RX_ADDR_P0)&&(tmp!=RF_RX_ADDR_P1)&&(tmp!=RF_TX_ADDR)) {
rf_read_register(tmp,&tmpVal,1);
printf("0x%02X=0x%02X\n",tmp,tmpVal);
delay_ms(3);
} else {
rf_read_register(tmp,tmpArr,5);
printf("0x%02X=0x%02X,0x%02X,0x%02X,0x%02X,0x%02X\n",tmp,tmpArr[0],tmpArr[1],tmpArr[2],tmpArr[3],tmpArr[4]);
delay_ms(12);
}
}
rf_read_register(RF_FEATURE,&tmp,1);
printf("0x1C=0x%02X\n",tmp,tmpVal);
rf_read_register(RF_DYNPD,&tmp,1);
printf("0x1D=0x%02X\n",tmp,tmpVal);
delay_ms(14);
#endif
if (pwr_clk_mgmt_is_vdd_below_bor_threshold()) rfPacket.powerLow=1; else rfPacket.powerLow=0;
if (dhtread()) {
if (datadht[1]==0 && datadht[3]==0) { // dht11
rfPacket.hum=datadht[2];
rfPacket.temp=datadht[0];
} else { // dht22
rfPacket.hum = (float)(datadht[0] * 256 + datadht[1])/10;
rfPacket.temp = (float)((datadht[2] & 0x7F)* 256 + datadht[3])/10;
if (datadht[2] & 0x80) rfPacket.temp *= -1;
}
} else {
rfPacket.errorCode|=0x1;
rfPacket.temp=-273;
rfPacket.hum=111;
}
#ifdef DEBUG
gpio_pin_val_clear(LEDPIN);
printf("\nPKT Id=%u,cnt=%u,err=%d,temp=%d,hum=%d,pwr=%u\n",rfPacket.deviceId,rfPacket.packetCount,rfPacket.errorCode,(int)rfPacket.temp,(int)rfPacket.hum,rfPacket.powerLow);
delay_ms(20);
puts("RF register dump:");
for(tmp=0;tmp<=0x17;tmp++) {
if ((tmp!=RF_RX_ADDR_P0)&&(tmp!=RF_RX_ADDR_P1)&&(tmp!=RF_TX_ADDR)) {
rf_read_register(tmp,&tmpVal,1);
delay_ms(5);
printf("0x%02X=0x%02X\n",tmp,tmpVal);
} else {
rf_read_register(tmp,tmpArr,5);
printf("0x%02X=0x%02X,0x%02X,0x%02X,0x%02X,0x%02X\n",tmp,tmpArr[0],tmpArr[1],tmpArr[2],tmpArr[3],tmpArr[4]);
delay_ms(5);
}
}
rf_read_register(RF_FEATURE,&tmp,1);
printf("0x1C=0x%02X\n",tmp,tmpVal);
rf_read_register(RF_DYNPD,&tmp,1);
printf("0x1D=0x%02X\n",tmp,tmpVal);
puts("Sleeping");
delay_ms(14);
#endif
rf_write_tx_payload((const uint8_t*) &rfPacket, sizeof(rfPacket), true);
rf_read_register(RF_EN_AA,&tmp,1);
while((!((tmp&0xF)&&rf_irq_max_rt_active()))&&(!(rf_irq_pin_active() && rf_irq_tx_ds_active())));
rf_irq_clear_all();
rf_power_down();
sleepCnt=0;
rtc2_run();
watchdog_set_wdsv_count(WD_SAFE);
pwr_clk_mgmt_close_retention_latches();
pwr_clk_mgmt_enter_pwr_mode_memory_ret_tmr_on();
}