This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
降级器、
当我们使用 AM437x GPMC FPGA 通信时、我们使用 多路复用的地址/数据线、但上地址线不起作用(A[27:17])、低16位地址正确、数据可以正常读取和写入。 例如、我们将值0x2写入 FPGA 寄存器地址0x1f3000、可以在逻辑分析仪上看到低16位地址0x3000的结果、后跟数据值0x2。 但是、高位地址行[22:16]始终处于初始状态0、未更改。
例如 ,将值0x2写入寄存器0x1f3000:
# echo 0x1f3000 0x2 > FPGA_reg
硬件连接:
GPMC_AD[15:0] 多路复用 器作为:GPMC_AD[15:0] ,用作: FPGA_AD[15:0]
GPMC_A[11:1] 多路复用器作为 GPMC_A[27:17],用作:FPGA_A[26:16]
我们使用异步模式:
内核源代码:
DTS 配置:
引脚模式:
MAI_FPGA_DEFAULT:MAI_FPGA_DEFAULT{
pinctrl-single、pins =<
0x0 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD0.GPMC_AD0 *//GPMC_AD[15:0]->GPMC_AD[15:0]->FPGA_AD[15:0];
0x4 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD1.GPMC_AD1 */
0x8 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD2.GPMC_AD2 *
0xc (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD3.GPMC_AD3 *
0x10 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD4.GPMC_AD4 */
0x14 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD5.GPMC_AD5 *
0x18 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD6.GPMC_AD6 *
0x1c (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD7.GPMC_AD7 *
0x20 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD8.GPMC_AD8 *
0x24 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD9.GPMC_AD9 *
0x28 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD10.GPMC_AD10 */
0x2C (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD11.GPMC_AD11 *
0x30 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD12.GPMC_AD12 */
0x34 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD13.GPMC_AD13 *
0x38 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD14.GPMC_AD14 *
0x3c (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD15.GPMC_AD15 *
0x44 (PIN_OUTPUT | MUX_Mode4)/* GPMC_A1.GPMC_a17 */// GPMC_A[11:1]->GPMC_A[27:17]->FPGA_A[26:16];
0x48 (PIN_OUTPUT | MUX_Mode4)/* GPMC_A2.GPMC_A18 */
0x4c (PIN_OUTPUT | MUX_Mode4)/* GPMC_A3.GPMC_A19 *
0x50 (PIN_OUTPUT | MUX_Mode4)/* GPMC_A4.GPMC_A20 *
0x54 (PIN_OUTPUT | MUX_Mode4)/* GPMC_A5.GPMC_A21 *
0x58 (PIN_OUTPUT | MUX_Mode4)/* GPMC_A6.GPMC_A22 *
0x5c (PIN_OUTPUT | MUX_Mode4)/* GPMC_A7.GPMC_A23 *
0x60 (PIN_OUTPUT | MUX_Mode4)/* GPMC_A8.GPMC_A24 */
0x64 (PIN_OUTPUT | MUX_Mode4)/* GPMC_A9.GPMC_A25 */
0x68 (PIN_OUTPUT | MUX_Mode4)/* GPMC_A10.GPMC_a26 */
0x6c (PIN_OUTPUT | MUX_Mode4)/* GPMC_A11.GPMC_A27*/
0x70 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_wait0.GPMC_wait0 */
0x7c (PIN_OUTPUT | MUX_MODE0)/* GPMC_csn0.GPMC_csn0 */
0x90 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_advn_ALe.GPMC_advn_ALE *
0x94 (PIN_OUTPUT PULLUP | MUX_MODE0)/* GPMC_oen_ren。GPMC_oen_ren *
0x98 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_WN.GPMC_Wen *
>;
};
时序设置为:
GPMC{
状态="正常";
pinctrl-names ="default"、"sleep";
pinctrl-0 =<&mi_fpga_default>;
//pinctrl-1 =<&mi_FPGA_SLEEP>;
范围=<0 0x08000000 0x04000000>;CS0空间上的/* MAI FPGA。 最小分区= 64MB */
FPGA@0、0{
兼容="MAI、GPMC-FPGA";
REG =<0 0x04000000>;
组宽度=<2>;
GPMC、mux-add-data =<2>;//mux addr;
中断= ;
中断控制器;
#interrupt-cells =<2>;
//interrupt-parent =<&GPIO0>;
//中断=<21 0x2>;
FPGA-RESET =<&GPIO3 7 GPIO_ACTIVE_LOW_>;
FPGA 就绪=<&GPIO0 12 GPIO_ACTIVE_HIGH_>;//输入,检查高电平是否就绪;确定;
GPMC、cs-on-ns =<0>;
GPMC、cs-rd -关闭-ns =<70>;
GPMC、cs-wr-off-ns =<60>;
GPMC、Adv-on-ns =<0>;
GPMC、Ad-rd -关闭-ns =<30>;
GPMC、Adv-wr-off-ns =<30>;
GPMC、WE-ON-ns =<30>;
GPMC、WE-OFF-ns =<60>;
GPMC、OE-ON-ns =<30>;
GPMC、OE-OFF-ns =<70>;
GPMC、ACCESS ns =<60>;
GPMC、第周期-ns =<70>;
GPMC、功率周期-ns =<60>;
//GPMC、总线周转时间=<0>;
GPMC、cycle2cycle-delay-ns =<20>;
GPMC、cycle2cycle-samecsen =<10>;
GPMC、cycle2cycle-diffcsen =<0>;
GPMC、wr 访问-ns =<60>;//?
GPMC、wr-data-mux-bus-ns =<30>;
#address-cells =<1>;
大小单元格=<1>;
};
};
高位地址 GPMC_A[11:1]被复用到 GPMC_A[27:17]中。 引脚复用配置读取的值如下、我 认为相应的模式4应该是相应的地址模式:
# devmem2 0x44e10844
/dev/mem 已打开。
映射到地址 bb6fe8000的内存。
地址0x44E10844 (b6fe8844)的值:0x10004
编号
# devmem2 0x44e10848
/dev/mem 已打开。
映射到地址 bb6efd000的内存。
地址0x44E10848 (0xb6efd848)的值:0x10004
编号
# devmem2 0x44e1084c
/dev/mem 已打开。
映射到地址 bb6f41000的内存。
地址0x44E1084C (0xb6f4184c)的值:0x10004
编号
# devmem2 0x44e10850
/dev/mem 已打开。
映射到地址 bb6f94000的内存。
地址0x44E10850 (bb6f94850)的值:0x10004
编号
编号
# devmem2 0x44e10854
/dev/mem 已打开。
映射到地址 bb6f5e000的内存。
地址0x44E10854 (bb6f5e854)的值:0x10004
编号
# devmem2 0x44e10858
/dev/mem 已打开。
映射到地址 bb6fc5000的内存。
地址0x44E10858 (bb6fc5858)的值:0x10004
编号
# devmem2 0x44e1085c
/dev/mem 已打开。
映射到地址 bb6f77000的内存。
地址0x44E1085C (0xb6f7785c)的值:0x10004
编号
# devmem2 0x44e10860
/dev/mem 已打开。
映射到地址 bb6f93000的内存。
地址0x44E10860 (bb6f93860)的值:0x10004
编号
# devmem2 0x44e10864
/dev/mem 已打开。
映射到地址 bb6fa3000的内存。
地址0x44E10864 (0xb6fa3864)上的值:0x10004
编号
# devmem2 0x44e10868
/dev/mem 已打开。
映射到地址 bb6fd6000的内存。
地址0x44E10868 (bb6fd6868)的值:0x10004
编号
# devmem2 0x44e1086c
/dev/mem 已打开。
映射到地址 bb6f22000的内存。
地址0x44E1086C (0xb6f2286c)的值:0x10004
这个问题非常紧迫、很难帮助检查异常的地方、非常感谢! !! !! !!
尊敬的用户6209888:
星期一之前我可能无法更详细地了解这一点、但让我与一位同事核实一下、看看他之前是否根据自己的经验提出了一些建议。
此致、Andreas
我认为您的上地址信号的引脚复用不正确。
请查看 TRM 中的表7-5。 您应该使用标记为“复用地址数据16位设备”的列。 该表显示您希望使用 GPMC 信号 A1-10和 A27。 因此、您应该为引脚设置引脚多路复用配置以使用这些信号。
我不确定您是如何连接 FPGA 的、但根据您之前的帖子、我认为您需要将引脚多路复用寄存器 GPMC A1-10设置为模式0、并将 GPMC_A11设置为模式4
此致、
James
尊敬的 James:
根据您的建议,我将 A1-A10配置为 mode0,它正在工作,我再次阅读 TRM,也许我理解一些错误,我可以解决这个问题。 非常感谢!