Doom Boy ESP32

Prefixo da desgraça para o ESP-it-yourself no driver MCP23017 para botões do UncleRus



Antecipando as horas da Perdição , chegou um quadro de projeto de longa data. O MCP23017 externo e o CS4344 e muitas outras coisas estão divorciados na

placa.Para botões, o expansor de porta MCP23017 conectado via I2C é usado. Para ele, há um driver que você pode obter no UncleRus .

Foi feita uma tentativa de iniciar um ADC CS4344 externo.

Doom por Espressif


Depois de baixar a porta, o Doom teve que mexer um pouco para coletá-la. No final, tudo se juntou e inundou o ESP32, mas ... eu peguei um acidente no início. Na questão githab do projeto, vi uma discussão semelhante sobre o problema:



O autor do porto sugeriu fazer
Você provavelmente precisará usar a opção malloc () e reservar alguma memória para o DMA. Vou ver se consigo compilar isso no master e atualizar o sdkconfig quando tiver tempo.
Em geral, eu "sem pensar duas vezes" substitui todas as funções de alocação de memória portada por malloc ()
. À minha frente estava conectando botões

MCP23017 Extensor GPIO




MCP23017

Com grandes planos para expandir a funcionalidade através das portas do controlador, decidi economizar um pouco nas portas de entrada / saída do próprio microcontrolador instalando o MCP23017. É um expansor simples com acesso a sinais de entrada / saída através da interface I2C. Eu não inventei o motorista, mas simplesmente o tirei do UncleRus .

Cinco botões usam o joystick para navegar. Um par de botões na foto e na seleção do menu. Na verdade, isso não basta, você ainda precisa abrir as portas e mover para a esquerda e para a direita sem virar, ou seja, como um caranguejo. Os resultados são obtidos dentro do MCP23017 para o VDD. O contato fecha ao chão. É muito legal que existam resistores de pull-up dentro do microcircuito. Ainda se pode confundir com as interrupções do MCP23017. Ele tem dois pinos para cada porta, INTA e INTB, mas de alguma forma outra hora.

Lista completa de equipes
static const JsKeyMap keymap[]={
	{0x10, &key_up},
	{0x40, &key_down},
	{0x80, &key_left},
	{0x20, &key_right},
	
	{0x4000, &key_use},				//cross
	{0x2000, &key_fire},			//circle
	{0x2000, &key_menu_enter},		//circle
	{0x8000, &key_pause},			//square
	{0x1000, &key_weapontoggle},	//triangle

	{0x8, &key_escape},				//start
	{0x1, &key_map},				//select
	
	{0x400, &key_strafeleft},		//L1
	{0x100, &key_speed},			//L2
	{0x800, &key_straferight},		//R1
	{0x200, &key_strafe},			//R2

	{0, NULL},
};


Era mais fácil cortar o processamento de botões do que eu pensava. Abaixei a frequência do I2C para melhorar a estabilidade. De qualquer forma, o 1MHz declarado não foi. A frequência de 100kHz foi suficiente para pesquisar em um ciclo com um atraso de 20ms.

CMake


Eu perdi muito tempo adicionando CMakeList.txt para componentes. Algo não funcionou com o make. E eu queria fazer um SDK mais recente. A porta original não estava indo para o 3.2.x. Tomou esp-idf-v3.3.1 provavelmente funcionará em esp-idf-4.0

Som através do DAC


Na verdade, há outro garfo . Possui um SD-CARD conectado e som através do DAC embutido. A porta original do Espressif permite carregar um arquivo wad apenas na memória Flash interna dos programas e, em seguida, você precisa usar um arquivo cortado no qual não há som!

O esquema aqui.A

idéia de conectar um DAC externo em vez do DAC interno me capturou. Pelo menos o centavo da Cirrus



Logic.Em seguida, configurei o DAC no CS4344 e fiquei decepcionado. O som funcionou com interrupções. Quando vi o arquivo i_sound.c no meu projetoNotei que um arquivo dma.h não é usado. Como se houvesse um link para ele, e ele próprio é, mas tudo está comentado. Talvez eu tenha assistido sem atenção? Mas acho que o autor também notou que algo estava errado com o som e tentou eliminá-lo. Talvez tenha sido eliminado e não postou o último commit. Ou talvez tudo funcione como deveria no DAC interno. No entanto, você pode negligenciar interrupções de distorção para emitir som através do DAC embutido e para um pequeno alto-falante. Eu brinquei com a taxa de bits e a alteração geral do código. Não trouxe nada.

E sim, com relação à conexão do SD-CARD. Inicialmente, pendurei-o em paralelo com a exibição no barramento SPI, separe o sinal para selecionar o chip CS separadamente. A ideia falhou. Ventilando a pergunta Suporte ao compartilhamento de barramento SD-SPIcheguei à conclusão de que nem todos os cartões SD são iguais ou minhas mãos não são tão retas. Eu tive que dessoldá-lo através do adaptador para a placa em vez do microfone. Foi encerrado sem pull-ups por resistores externos ao VDD.
Resistores internos manipulados

    gpio_set_pull_mode(PIN_NUM_MOSI, GPIO_PULLUP_ONLY);
    gpio_set_pull_mode(PIN_NUM_MISO, GPIO_PULLUP_ONLY);
    gpio_set_pull_mode(PIN_NUM_CLK, GPIO_PULLUP_ONLY);
    gpio_set_pull_mode(PIN_NUM_CS, GPIO_PULLUP_ONLY);


Nisso, encerrei esta lição e postei o código-fonte no GitHub .

Seria necessário fazer outra edição da placa de circuito impresso. Este não é bom!


Não há som no vídeo.

E também tive um contato com o joystick para virar quando soldava. Em geral, a primeira panqueca é

UPD irregular

, consegui estabelecer um som. Empurrões estão presentes, mas não são críticos. Alterações de código:

spi_lcd.c
dmamem[x]=heap_caps_malloc(MEM_PER_TRANS*2, MALLOC_CAP_DMA);

i_sound.c
void IRAM_ATTR updateTask(void *arg)
{
// size_t bytesWritten;
while(1)
{
I_UpdateSound();
i2s_write(I2S_NUM_0, mixbuffer, SAMPLECOUNT*SAMPLESIZE, &bytesWritten, portMAX_DELAY);
}
}


.dma_buf_count = 2,
.dma_buf_len = 512,


xTaskCreatePinnedToCore(&updateTask, "updateTask", 1000, NULL, 7, NULL, 0);

All Articles