17.LAN9252 索引模式 vs 间接寻址模式

张开发
2026/5/19 3:13:02 15 分钟阅读
17.LAN9252 索引模式 vs 间接寻址模式
LAN9252 的HBIHost Bus Interface有两种核心寄存器访问模式索引模式Indexed Mode和间接寻址模式Indirect/CSR Mode二者在硬件接法、软件逻辑、适用场景上有本质区别下面分模块详细说明。一、核心定义与适用场景模式核心原理适用接口核心特点索引模式Indexed Mode地址/数据直接映射通过地址偏移直接访问寄存器16bit 复用/非复用 HBI 并行接口高速、极简、无等待FMC 并行驱动首选间接寻址模式Indirect/CSR Mode通过CSR 命令寄存器0x304发命令等待 BUSY 后读写数据SPI / 8bit 并行 / 资源受限场景兼容低速接口、软件模拟速度慢、逻辑复杂二、硬件接法区别最关键1. 索引模式Indexed Mode硬件要求1核心接线16bit 复用 HBIFMC 推荐数据/地址总线AD[15:0]复用地址/数据分时共用控制信号RD读使能→ STM32FMC_NOEWR写使能→ STM32FMC_NWECS片选→ STM32FMC_NE1/NE4ALELO/ALEHI地址锁存→ STM32FMC_NL复用模式/ 独立地址线非复用地址线要求复用模式无需独立地址线 A0~Axx地址通过 AD 总线传输ALE 锁存非复用模式需要独立地址线 A0~Axx与数据线完全分开其他要求无需额外命令/数据寄存器引脚直接地址映射访问2. 间接寻址模式Indirect/CSR Mode硬件要求1核心接线SPI 为例并行也可SPI 接口SCK/MOSI/MISO/CS仅 4 根线无需地址线、ALE并行间接模式仅需 8bit 数据总线 RD/WR/CS无需地址线核心依赖CSR_CMD_REG0x304命令寄存器用于发送读/写命令、地址、长度CSR_DATA_REG0x308数据寄存器用于实际读写数据必须等待BUSY位bit7清零才能操作数据寄存器3. 硬件接法核心差异表对比项索引模式Indexed间接寻址模式Indirect/CSR总线结构16bit 并行复用/非复用地址/数据直接映射SPI / 8bit 并行仅命令/数据口地址线需求复用模式无非复用模式A0~Axx完全不需要地址线ALE 需求复用模式必须非复用模式不需要完全不需要核心寄存器无专用命令寄存器直接访问所有寄存器必须依赖0x304CSR_CMD和0x308CSR_DATAMODE 引脚配置011复用/100非复用111SPI/0008bit 间接硬件复杂度高16bit 并行 控制信号低4线 SPI / 8bit 并行速度上限极高FMC 并行几十 MHz低SPI 最高 50MHz并行间接也远低于索引模式三、软件设计区别代码逻辑完全不同1. 索引模式Indexed Mode软件设计1核心逻辑直接地址映射无等待极简所有寄存器直接通过基地址 偏移访问无需命令、无需等待 BUSYFMC 硬件自动完成地址锁存、时序控制软件仅需指针操作2核心读写函数16bit 复用 HBI// 基地址FMC Bank1 0x60000000对应 NE1 片选 #define LAN9252_BASE_ADDR ((uint32_t)0x60000000) // 读 32bit 寄存器索引模式直接访问 uint32_t PMPReadDWord_Indexed(uint16_t Address) { uint32_t res; // 直接读低16位 res *(volatile uint16_t*)(LAN9252_BASE_ADDR Address); // 地址2读高16位 res | (uint32_t)*(volatile uint16_t*)(LAN9252_BASE_ADDR Address 2) 16; return res; } // 写 32bit 寄存器索引模式直接访问 void PMPWriteDWord_Indexed(uint16_t Address, uint32_t Val) { // 直接写低16位 *(volatile uint16_t*)(LAN9252_BASE_ADDR Address) (uint16_t)Val; // 地址2写高16位 *(volatile uint16_t*)(LAN9252_BASE_ADDR Address 2) (uint16_t)(Val 16); } // 读 ID索引模式直接读 0x0000 uint32_t LAN9252_ReadID(void) { return PMPReadDWord_Indexed(0x0000); // 直接返回 0x00009252 }3FMC 配置要求非复用模式DataAddressMux DISABLE16bit 位宽异步模式MPU 配置禁止写缓冲、允许读缓存保证时序稳定2. 间接寻址模式Indirect/CSR Mode软件设计1核心逻辑命令等待数据三步操作所有寄存器访问必须通过CSR 命令寄存器0x304发起必须等待BUSY位bit7清零才能操作CSR_DATA_REG0x308软件需模拟完整的命令流程逻辑复杂、速度慢2核心读写函数CSR 间接模式// 间接模式CSR 命令寄存器 0x304数据寄存器 0x308 #define CSR_CMD_REG 0x304 #define CSR_DATA_REG 0x308 #define ESC_READ_BYTE 0x01 // 读命令 #define ESC_WRITE_BYTE 0x02 // 写命令 #define ESC_CSR_BUSY 0x80 // BUSY 位bit7 // 间接模式读寄存器 void PMPReadReg_Indirect(uint8_t *ReadBuffer, uint16_t Address, uint8_t Count) { uint32_t param32 0; uint8_t i 0; // 步骤1写命令到 CSR_CMD_REG0x304 param32 (Address 0xFFFF) | ((uint32_t)Count 16) | ((uint32_t)ESC_READ_BYTE 24); PMPWriteDWord_Indexed(CSR_CMD_REG, param32); // 索引模式写命令口间接模式依赖索引模式写命令 // 步骤2等待 BUSY 位清零 do { param32 PMPReadDWord_Indexed(CSR_CMD_REG); } while(param32 ESC_CSR_BUSY); // 步骤3从 CSR_DATA_REG0x308读数据 param32 PMPReadDWord_Indexed(CSR_DATA_REG); for(i 0; i Count; i) ReadBuffer[i] (uint8_t)(param32 (i*8)); } // 间接模式写寄存器 void PMPWriteReg_Indirect(uint8_t *WriteBuffer, uint16_t Address, uint8_t Count) { uint32_t param32 0; uint8_t i 0; // 步骤1写数据到 CSR_DATA_REG0x308 param32 0; for(i 0; i Count; i) param32 | (uint32_t)WriteBuffer[i] (i*8); PMPWriteDWord_Indexed(CSR_DATA_REG, param32); // 步骤2写命令到 CSR_CMD_REG0x304 param32 (Address 0xFFFF) | ((uint32_t)Count 16) | ((uint32_t)ESC_WRITE_BYTE 24); PMPWriteDWord_Indexed(CSR_CMD_REG, param32); // 步骤3等待 BUSY 位清零 do { param32 PMPReadDWord_Indexed(CSR_CMD_REG); } while(param32 ESC_CSR_BUSY); }3SPI 间接模式软件逻辑并行间接类似软件模拟 SPI 时序发送命令、地址、长度等待 BUSY再读写数据完全依赖软件模拟无需 FMC 硬件适合无 FMC 的 MCU3. 软件设计核心差异表对比项索引模式Indexed间接寻址模式Indirect/CSR访问方式直接地址映射指针操作命令寄存器发起等待 BUSY 后读写代码复杂度极低仅需直接读写极高需命令、等待、数据三步等待要求完全无等待硬件自动完成必须等待 BUSY 位清零否则卡死速度极快FMC 并行无额外开销极慢命令等待开销巨大FMC 依赖必须并行接口可选SPI 无需 FMC寄存器访问限制无可直接访问所有寄存器仅能通过 CSR 访问无法直接映射适用场景STM32 FMC 并行驱动高性能 EtherCAT 从机SPI 接口、资源受限 MCU、低速通信四、市面上的开发板市面上的开发板其实都是选用的间接寻址模式硬件上引脚数量少软件上与SPI模式很像修改量小。这也是很多人蒙蔽的原因以为代码是错的。如果想要最高速率还是需要使用索引模式。即选用0X8D。索引模式的代码市面上没有现成的需要去MicroChip官网下载LAN9252-PIC32_SDK_V1.1文件修改为STM32的。五、总结如果想提高速率选用索引模式不要选用间接寻址模式很鸡肋。下篇说明。

更多文章