网站建设过程中要注意的事项,重庆比较好的广告公司,上海快速建设网站公司,天津市建设厅网站Zephyr 开发笔记#xff1a;RA6E2 SPI 屏 (SSD1306) 双路 ADC
1. 硬件接线表 (根据代码分析)
根据你的 app.overlay 配置#xff0c;硬件连接如下。请务必检查物理连线是否一致#xff1a;模块功能 (Pin Name)RA6E2 引脚备注SSD1306D0 (SCK/CLK)P111SPI0 RSPCK (硬件 SPI 时…Zephyr 开发笔记RA6E2 SPI 屏 (SSD1306) 双路 ADC1. 硬件接线表 (根据代码分析)根据你的app.overlay配置硬件连接如下。请务必检查物理连线是否一致模块功能 (Pin Name)RA6E2 引脚备注SSD1306D0 (SCK/CLK)P111SPI0 RSPCK (硬件 SPI 时钟)D1 (MOSI/DIN)P109SPI0 MOSI (硬件 SPI 数据)RES (Reset)P208GPIO 输出DC (Data/Cmd)P110GPIO 输出CS (Chip Sel)P301GPIO 输出VCC3.3VGNDGNDADCAN002P002模拟输入通道 2AN004P004模拟输入通道 4注意你的代码中 D/C 使用的是P110(ioport1 10 ...)而 MOSI 使用的是P109(RA_PSEL(..., 1, 9))。这与常见的 P109/P110 功能互换不同请确保接线严格对应代码。2. 软件配置2.1 项目配置 (prj.conf)这里启用了 SPI 驱动并配置了 CFB 字体。# --- 系统基础 --- CONFIG_STDOUT_CONSOLEy CONFIG_LOGy CONFIG_HEAP_MEM_POOL_SIZE4096 # --- 外设驱动 --- CONFIG_GPIOy CONFIG_SPIy CONFIG_ADCy # --- 显示系统 (SSD1306 SPI) --- CONFIG_DISPLAYy CONFIG_SSD1306y CONFIG_SSD1306_DEFAULT_CONTRAST128 # --- 图形库 (CFB) --- CONFIG_CHARACTER_FRAMEBUFFERy # 保持默认字体设置避免字体宏冲突 CONFIG_CHARACTER_FRAMEBUFFER_USE_DEFAULT_FONTSy # --- 日志级别 --- CONFIG_ADC_LOG_LEVEL_INFy2.2 设备树覆盖 (app.overlay)这是最核心的部分。我们做了两件事ADC 配置添加 P002 和 P004 到 ADC0。SPI 自定义配置这是难点。系统默认的spi0可能包含 P109/P110/P111 全套引脚。我们需要定义一个新的引脚组spi0_new_custom只包含SCK 和 MOSI把其他引脚释放出来给 GPIO 使用。/* * SSD1306 SPI Overlay for Renesas FPB-RA6E2 */ #include zephyr/dt-bindings/gpio/gpio.h #include zephyr/dt-bindings/pinctrl/renesas/pinctrl-ra.h / { chosen { zephyr,display ssd1306_spi; /* 指定使用 SPI 屏作为主显示 */ }; }; /* 强制开启相关 GPIO 端口控制 */ ioport1 { status okay; }; ioport2 { status okay; }; ioport3 { status okay; }; pinctrl { /* * 自定义 SPI0 引脚组 * 仅配置 MOSI (P109) 和 SCK (P111) 给 SPI 控制器 * P110 未在此处出现因此可以被用作普通 GPIO (D/C) */ spi0_new_custom: spi0_new_custom { group1 { psels RA_PSEL(RA_PSEL_SPI, 1, 9), /* MOSI: P109 */ RA_PSEL(RA_PSEL_SPI, 1, 11); /* SCK: P111 */ drive-strength high; /* 增强驱动能力提升 SPI 稳定性 */ }; }; /* ADC 引脚配置 */ adc0_default: adc0_default { group1 { psels RA_PSEL(RA_PSEL_ADC, 0, 2), /* AN002: P002 */ RA_PSEL(RA_PSEL_ADC, 0, 4); /* AN004: P004 */ renesas,analog-enable; }; }; }; spi0 { status okay; /* 应用我们自定义的引脚配置 */ pinctrl-0 spi0_new_custom; pinctrl-names default; /* CS 片选引脚 (P301) - 由 SPI 驱动软件控制 */ cs-gpios ioport3 1 GPIO_ACTIVE_LOW; ssd1306_spi: ssd13060 { compatible solomon,ssd1306fb; reg 0; /* * SPI 频率: 100kHz 用于调试。 * 如果屏幕刷新太慢后续可改为 4000000 (4MHz) 或更高 */ spi-max-frequency 100000; width 128; height 64; segment-offset 0; page-offset 0; display-offset 0; multiplex-ratio 63; segment-remap; com-invdir; prechargep 0x22; /* D/C 引脚: P110 */ >3. 代码实现 (main.c)逻辑与 I2C 版本基本通用因为 Zephyr 屏蔽了底层 SPI/I2C 的差异。只需注意display_dev是通过zephyr,display自动获取的。#includezephyr/kernel.h#includezephyr/device.h#includezephyr/drivers/display.h#includezephyr/display/cfb.h#includezephyr/drivers/adc.h#includestdio.h#includezephyr/logging/log.hLOG_MODULE_REGISTER(main,LOG_LEVEL_INF);/* ADC 定义 */conststructdevice*adc_devDEVICE_DT_GET(DT_NODELABEL(adc0));#defineADC_CH2_ID2#defineADC_CH4_ID4staticint16_tm_sample_buffer;/* ADC 初始化辅助函数 */staticintsetup_adc_channel(intid){structadc_channel_cfgcfg{.gainADC_GAIN_1,.referenceADC_REF_INTERNAL,.acquisition_timeADC_ACQ_TIME_DEFAULT,.channel_idid,};returnadc_channel_setup(adc_dev,cfg);}/* ADC 读取辅助函数 */staticintread_adc_val(intid,int16_t*val){structadc_sequenceseq{.channelsBIT(id),.bufferm_sample_buffer,.buffer_sizesizeof(m_sample_buffer),.resolution12,};intretadc_read(adc_dev,seq);*valm_sample_buffer;returnret;}intmain(void){/* 1. 获取显示设备 (自动根据 chosen 节点找到 ssd1306_spi) */conststructdevice*displayDEVICE_DT_GET(DT_CHOSEN(zephyr_display));if(!device_is_ready(display)){LOG_ERR(Display not ready! Check SPI wiring.);return0;}if(!device_is_ready(adc_dev)){LOG_ERR(ADC not ready!);return0;}/* 2. 初始化显示 */display_blanking_off(display);cfb_framebuffer_init(display);cfb_framebuffer_set_font(display,0);// 使用默认字体/* 3. 初始化 ADC */setup_adc_channel(ADC_CH2_ID);setup_adc_channel(ADC_CH4_ID);LOG_INF(System Started: SPI SSD1306 ADC);charbuf[32];int16_tval2,val4;while(1){/* 读取 ADC */read_adc_val(ADC_CH2_ID,val2);read_adc_val(ADC_CH4_ID,val4);/* 串口打印 */LOG_INF(ADC: CH2%d, CH4%d,val2,val4);/* 屏幕显示 */cfb_framebuffer_clear(display,false);cfb_print(display,RA6E2 Monitor,0,0);snprintf(buf,sizeof(buf),AN002: %d,val2);cfb_print(display,buf,0,16);snprintf(buf,sizeof(buf),AN004: %d,val4);cfb_print(display,buf,0,32);/* 画个动态条 (简单的可视化) */intbar_w(val2*100)/4095;structcfb_positionstart{0,50};structcfb_positionend{bar_w,54};cfb_draw_rect(display,start,end);cfb_framebuffer_finalize(display);k_sleep(K_MSEC(200));}return0;}4. 调试常见问题屏幕全黑没反应检查RES (P208)和D/C (P110)接线。SPI 屏如果不复位或 D/C 状态错误完全不会显示。检查D1 (MOSI)和D0 (SCK)是否接反。尝试调低spi-max-frequency例如 100000 (100kHz)确保不是信号质量问题。ADC 读数不准RA6E2 的模拟地 (AVSS0) 和数字地 (VSS) 必须共地。如果读数跳动大可以在 ADC 通道配置中增加zephyr,acquisition-time。编译报错pinctrl冲突确保你的 overlay 中spi0已经覆写了pinctrl-0为spi0_new_custom否则默认的 pinctrl 配置可能会抢占 P110 引脚导致 GPIO 初始化失败。