Планирую использовать блок I2S для генерации несущей для IR-передатчика, как в примере espressif.
Они предлагают использовать GPIO2 (I2SO_WS), GPIO14 (I2SI_WS), GPIO13(I2SI_BCK), при этом расчет в примере делается для 38 кГц.
Перебирал делители и так и эдак, но так и не понял идею расчета (например, что надо изменить, чтобы получить несущую 36 или 40 кГц вместо 38?).
Они предлагают использовать GPIO2 (I2SO_WS), GPIO14 (I2SI_WS), GPIO13(I2SI_BCK), при этом расчет в примере делается для 38 кГц.
Перебирал делители и так и эдак, но так и не понял идею расчета (например, что надо изменить, чтобы получить несущую 36 или 40 кГц вместо 38?).
Код:
/******************************************************************************
* FunctionName : gen_carrier_clk
* Description : gen 38khz carrier clk
* Parameters : NONE
* Returns : NONE
*******************************************************************************/
void ICACHE_FLASH_ATTR
gen_carrier_clk()
{
//ENABLE I2S CLK SOURCE
rom_i2c_writeReg_Mask(i2c_bbpll, i2c_bbpll_hostid, i2c_bbpll_en_audio_clock_out, i2c_bbpll_en_audio_clock_out_msb, i2c_bbpll_en_audio_clock_out_lsb, 1);
//CONFIG AS I2S
#if (IR_NEC_TX_IO_MUX==PERIPHS_IO_MUX_GPIO2_U)
//set i2s clk freq GPIO2!!!
WRITE_PERI_REG(I2SCONF, READ_PERI_REG(I2SCONF) & 0xf0000fff|
( (( 62&I2S_BCK_DIV_NUM )<<I2S_BCK_DIV_NUM_S)|
((2&I2S_CLKM_DIV_NUM)<<I2S_CLKM_DIV_NUM_S)|
((1&I2S_BITS_MOD ) << I2S_BITS_MOD_S ) ) );
WRITE_PERI_REG(IR_NEC_TX_IO_MUX, (READ_PERI_REG(IR_NEC_TX_IO_MUX)&0xfffffe0f)| (0x1<<4) );
WRITE_PERI_REG(0x60000e08, READ_PERI_REG(0x60000e08) & 0xfffffdff | (0x1<<8) ); //i2s tx start
#endif
#if (IR_NEC_TX_IO_MUX==PERIPHS_IO_MUX_MTMS_U)
//set i2s clk freq
WRITE_PERI_REG(I2SCONF, READ_PERI_REG(I2SCONF) & 0xf0000fff|
( (( 62&I2S_BCK_DIV_NUM )<<I2S_BCK_DIV_NUM_S)|
((2&I2S_CLKM_DIV_NUM)<<I2S_CLKM_DIV_NUM_S)|
((1&I2S_BITS_MOD ) << I2S_BITS_MOD_S ) ) );
WRITE_PERI_REG(IR_NEC_TX_IO_MUX, (READ_PERI_REG(IR_NEC_TX_IO_MUX)&0xfffffe0f)| (0x1<<4) );
WRITE_PERI_REG(0x60000e08, READ_PERI_REG(0x60000e08) & 0xfffffdff | (0x2<<8) ) ;//i2s rx start
#endif
#if (IR_NEC_TX_IO_MUX==PERIPHS_IO_MUX_MTCK_U)
//set i2s clk freq GPIO13!!!
WRITE_PERI_REG(I2SCONF, READ_PERI_REG(I2SCONF) & 0xf0000fff|
( (( 63&I2S_BCK_DIV_NUM )<<I2S_BCK_DIV_NUM_S)|
((63&I2S_CLKM_DIV_NUM)<<I2S_CLKM_DIV_NUM_S)|
((1&I2S_BITS_MOD ) << I2S_BITS_MOD_S ) ) );
WRITE_PERI_REG(IR_NEC_TX_IO_MUX, (READ_PERI_REG(IR_NEC_TX_IO_MUX)&0xfffffe0f)| (0x1<<4) );
WRITE_PERI_REG(0x60000e08, READ_PERI_REG(0x60000e08) & 0xfffffdff | (0x2<<8) ) ;//i2s rx start
#endif
#if (IR_NEC_TX_IO_MUX==PERIPHS_IO_MUX_MTDO_U)
//set i2s clk freq
WRITE_PERI_REG(I2SCONF, READ_PERI_REG(I2SCONF) & 0xf0000fff|
( (( 63&I2S_BCK_DIV_NUM )<<I2S_BCK_DIV_NUM_S)|
((63&I2S_CLKM_DIV_NUM)<<I2S_CLKM_DIV_NUM_S)|
((1&I2S_BITS_MOD ) << I2S_BITS_MOD_S )));
WRITE_PERI_REG(IR_NEC_TX_IO_MUX, (READ_PERI_REG(IR_NEC_TX_IO_MUX)&0xfffffe0f)| (0x1<<4) );
WRITE_PERI_REG(0x60000e08, READ_PERI_REG(0x60000e08) & 0xfffffdff | (0x1<<8) ); //i2s tx start
#endif
}