厄运男孩ESP32

ESP32上的Doom前缀可以自己在MCP23017驱动程序上完成,以处理来自UncleRus的按钮



在预期末日小时,一个长期项目的董事会来了。板上的外部MCP23017和CS4344以及其他很多东西已经离婚,

这些按钮使用通过I2C连接的MCP23017端口扩展器。对于他来说,有一个可以从UncleRus获得的驱动程序

试图启动一个外部ADC CS4344。

厄运之路


下载端口后,Doom不得不花一点时间来收集它。最终,一切融合到了ESP32中,但是……我在一开始就崩溃了。在项目的githab问题上,我看到了对该问题的类似讨论:



港口的作者建议
您可能需要使用malloc()选项以及为DMA保留一些内存。我将查看是否有空在master上进行编译并在有时间时更新sdkconfig。
通常,我“三思而后行”将所有移植的内存分配函数替换为malloc()
在我前面的是连接按钮

MCP23017 GPIO扩展器




MCP23017

通过通过控制器端口扩展功能的宏伟计划,我决定通过安装MCP23017在微控制器本身的输入/输出端口上节省一些时间。它是一个简单的扩展器,可以通过I2C接口访问输入/输出信号。我没有发明驱动程序,只是从UncleRus那里获得了它

五个按钮使用操纵杆进行导航。拍摄和菜单选择上的几个按钮。实际上,这还不够,您仍然必须打开门并左右移动而不转动,即像螃蟹一样。调查结果被拉入MCP23017内部至VDD。触点接地。微电路内部有上拉电阻非常酷。人们仍然会对来自MCP23017的中断感到困惑。每个端口都有两个引脚,即INTA和INTB,但又有一段时间。

完整的球队名单
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},
};


简化按钮的处理比我想象的要容易。我降低了I2C频率以提高稳定性。在任何情况下,声明的1MHz都不会消失。100kHz的频率足以在一个20ms的延迟周期内进行轮询。

CMake的


我为组件添加CMakeList.txt花费了很多时间。make无法正常工作。我想要一个更新的SDK。原始端口甚至没有达到3.2.x。采取esp-idf-v3.3.1可能会在esp-idf-4.0上运行

通过DAC发出声音


其实还有另外一个叉子。它具有连接的SD-CARD,并通过内置DAC发出声音。 Espressif的原始端口仅允许您将一个wad文件加载到程序的内部闪存中,然后您需要使用没有声音的剪切文件!

这里的方案

连接外部DAC而不是内置DAC的想法吸引了我。至少是Cirrus Logic的一分钱。



接下来,我在CS4344上设置了DAC,然后我很失望。声音间断。当我在项目中看到文件i_sound.c我注意到没有使用一个dma.h文件。好像有一个与他的链接,而他本人也是如此,但是一切都在评论中。也许我注意力不集中?但是我认为作者也注意到声音有问题,并试图消除它。可能已删除,并且没有发布最后一次提交。也许一切都可以在内部DAC上正常运行。但是,要通过内置的DAC输出声音并向小巧的扬声器输出声音,失真干扰也可以忽略不计。我试用了比特率和整体代码更改。它什么也没带来。

是的,关于SD-CARD的连接。最初,我将其与SPI总线上的显示器并行悬挂,分离用于分别选择CS芯片的信号。这个想法失败了。通过通风问题支持SD-SPI总线共享得出的结论是,并非所有SD-CARD都是一样的,或者我的手不是很直。我必须通过适配器而不是麦克风将其拆焊到板上。它由外部电阻上拉至VDD时没有上拉就被缠绕。
内部电阻处理

    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);


关于这一点,我退出了本课程,并将源代码发布到了GitHub上

有必要制作另一版印刷电路板。这一个不好!


视频无声音。

当我焊接时,我还有一个用于转动的操纵杆触点。总的来说,第一个煎饼是块状的

UPD,

我设法建立了声音。存在抽搐,但不是很关键。代码更改:

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