uint8_t gpio_num = rmt_param->gpio_num;
uint8_t mem_cnt = rmt_param->mem_block_num;
int clk_div = rmt_param->clk_div;
+ uint32_t carrier_freq_hz = rmt_param->tx_config.carrier_freq_hz;
+ bool carrier_en = rmt_param->tx_config.carrier_en;
RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG);
RMT_CHECK(GPIO_IS_VALID_GPIO(gpio_num), RMT_GPIO_ERROR_STR, ESP_ERR_INVALID_ARG);
RMT_CHECK((mem_cnt + channel <= 8 && mem_cnt > 0), RMT_MEM_CNT_ERROR_STR, ESP_ERR_INVALID_ARG);
RMT_CHECK((clk_div > 0), RMT_CLK_DIV_ERROR_STR, ESP_ERR_INVALID_ARG);
+ if (mode == RMT_MODE_TX) {
+ RMT_CHECK((!carrier_en || carrier_freq_hz > 0), "RMT carrier frequency can't be zero", ESP_ERR_INVALID_ARG);
+ }
+
periph_module_enable(PERIPH_RMT_MODULE);
RMT.conf_ch[channel].conf0.div_cnt = clk_div;
if(mode == RMT_MODE_TX) {
uint32_t rmt_source_clk_hz = 0;
- uint32_t carrier_freq_hz = rmt_param->tx_config.carrier_freq_hz;
uint16_t carrier_duty_percent = rmt_param->tx_config.carrier_duty_percent;
uint8_t carrier_level = rmt_param->tx_config.carrier_level;
uint8_t idle_level = rmt_param->tx_config.idle_level;
portEXIT_CRITICAL(&rmt_spinlock);
/*Set carrier*/
- uint32_t duty_div, duty_h, duty_l;
- duty_div = rmt_source_clk_hz / carrier_freq_hz;
- duty_h = duty_div * carrier_duty_percent / 100;
- duty_l = duty_div - duty_h;
- RMT.conf_ch[channel].conf0.carrier_out_lv = carrier_level;
- RMT.carrier_duty_ch[channel].high = duty_h;
- RMT.carrier_duty_ch[channel].low = duty_l;
- RMT.conf_ch[channel].conf0.carrier_en = rmt_param->tx_config.carrier_en;
+ RMT.conf_ch[channel].conf0.carrier_en = carrier_en;
+ if (carrier_en) {
+ uint32_t duty_div, duty_h, duty_l;
+ duty_div = rmt_source_clk_hz / carrier_freq_hz;
+ duty_h = duty_div * carrier_duty_percent / 100;
+ duty_l = duty_div - duty_h;
+ RMT.conf_ch[channel].conf0.carrier_out_lv = carrier_level;
+ RMT.carrier_duty_ch[channel].high = duty_h;
+ RMT.carrier_duty_ch[channel].low = duty_l;
+ } else {
+ RMT.conf_ch[channel].conf0.carrier_out_lv = 0;
+ RMT.carrier_duty_ch[channel].high = 0;
+ RMT.carrier_duty_ch[channel].low = 0;
+ }
ESP_LOGD(RMT_TAG, "Rmt Tx Channel %u|Gpio %u|Sclk_Hz %u|Div %u|Carrier_Hz %u|Duty %u",
- channel, gpio_num, rmt_source_clk_hz, clk_div, carrier_freq_hz, carrier_duty_percent);
+ channel, gpio_num, rmt_source_clk_hz, clk_div, carrier_freq_hz, carrier_duty_percent);
+
}
else if(RMT_MODE_RX == mode) {
uint8_t filter_cnt = rmt_param->rx_config.filter_ticks_thresh;