# GBOX-nes **Repository Path**: weimingtom2000/gbox_nes ## Basic Information - **Project Name**: GBOX-nes - **Description**: GOX是基于esp32的复古开源游戏机 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-06-20 - **Last Updated**: 2022-06-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 2021-11-1 ### 进展 1、已经实现功能游戏显示 ![1](pic/gbox.png) 2、根据官方源码基于最新的esp-idf修改了spi屏幕显示相关代码。参考了esplay掌机源码 3、官方源码中采用是nes串行游戏手柄,改为通过按键来操作。参考了esplay掌机源码 4、开发环境使用的是vscode+platformio。 5、屏幕用的是st7789 320*240屏幕 ### 问题记录 1、调试过程中最大的问题是的显示乱码,当时花了好长时间时间 - 首先就排查了屏幕驱动问题,检查了st7789初始化代码,后来搞了一张图片来显示,图片正常,说明驱动是正常的。 - 后面就仔细对比了源码与esplay掌机源码的区别,发现基本一致,这个问题非常苦恼,当时用与测试的rom是坦克大战。仔细观察后,**发现屏幕底部偶尔有坦克炮弹的样子,猜想是数据显示错位**,最后没有办法,死马当活马医,将nes模拟器发过来的屏幕数据偏移一个屏幕,也就是前(320*240)个像素数据不用。用这之后的,测试惊喜发现显示正常了。原因未知,因为官方源码和esplay掌机源码都没有对数据做偏移设置,不知道这是不是有更深层次的原因没有找到,不过暂时先用偏移解决掉问题。 ![2](pic/2.png) ```C{.line-numbers} //diplay_nes.c //修改之后的代码 ,偏移量进行了细致的调整 int bufferIndex = ((y + i +NES_FRAME_HEIGHT-39) * NES_FRAME_WIDTH)-44; //原始代码 int bufferIndex = ((y + i ) * NES_FRAME_WIDTH); ``` 2、遇到另一个更坑的问题是,代码频繁无法下载。网上搜索了别人的方案,说是先要将io0 和 en引脚拉低(分别是boot 和 reset),上电后,先释放io0,在释放en,即可实现下载,给的原因是,串口芯片自动让esp32进入编程模式时序有问题。 按照此方法实验,发现确实可行,偶尔能成功,但大多是还是不行。当时一度怀疑芯片坏了 - 问题解决:问题解决也是很奇特,突然想到有没有可能是外设的干扰造成的,于是把屏幕的3.3v断开,再下载程序,我x,竟然正常了,下载成功率100%。后来分析测试,以为是屏幕或sd卡的某个接到单片机的引脚出现干扰,经过每个引脚断开下载测试,发现无关联,最后只能怀疑是供电原因。模块上用的是一片ams1117供电,当街上所有外设后,3.3v电压会调到3.2v。 这就是造成无法下载的原因。 - 后续在设计电路板的时候,最好芯片单独供电,以防止供电原因造成无法下载程序 2021-11-9 1、已查明不能下载的原因是gpio2进行了外部上拉,gpio2用于sd卡传输接口,必须要使用外部上来。而gpio2刚好是strapping管脚,在进入编程模式时要保持高组态或者0电平,否则会导致进入编程模式失败。 ![3](pic/3.png) ![4](pic/4.png) 修复方式,就是在通过串口芯片在编程时,自动将io2口拉到低电平。 2021-11-10 1、开启外部sram menuconfig -> component config ->esp32 specific -> support for external spi ram ->spi ram config -> initialize spi & spi ram access method -> integrate ram into memory map 不选择 integrate ram into memory map 会造成程序运行报错