]> granicus.if.org Git - esp-idf/commitdiff
RMT: Don't require carrier_freq_hz to be non-zero if carrier_en unset
authorAngus Gratton <angus@espressif.com>
Thu, 22 Dec 2016 02:21:11 +0000 (13:21 +1100)
committerAngus Gratton <angus@espressif.com>
Tue, 27 Dec 2016 23:17:56 +0000 (10:17 +1100)
Closes github #123 https://github.com/espressif/esp-idf/issues/123

components/driver/rmt.c

index e29f190024db0e30a911c80124912ea2f8b1b2bf..a16f0f8fe54abf3945218d3d40e2257e1db93b3d 100644 (file)
@@ -380,10 +380,16 @@ esp_err_t rmt_config(rmt_config_t* rmt_param)
     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;
@@ -397,7 +403,6 @@ esp_err_t rmt_config(rmt_config_t* rmt_param)
 
     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;
@@ -416,16 +421,23 @@ esp_err_t rmt_config(rmt_config_t* rmt_param)
         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;