打印
[MCU]

AM4378,地址映射方式进行io复用操作时,寄存器写不进去数值

[复制链接]
477|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丑小鸭丶|  楼主 | 2020-9-15 11:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 丑小鸭丶 于 2020-9-15 11:43 编辑

如题:在进行IO复用操作,先对寄存器进行地址映射,然后往寄存器里面写数据,但是发现写入失败,跪求大佬帮忙看下。

具体步骤 & 现象:
1、先进行IO复用相关寄存器地址映射
2、将值写入寄存器
3、读取寄存器的值,还是原来的默认值

备注:
      同样是寄存器地址映射,写入GPIO寄存器、和写入SPI寄存器的值就可以正常写入,只有复用寄存器写入不了。大致代码如下:
备注:代码发不进来,不知道为啥,将代码贴到评论区了。

<blockquote> /* pin mux io map */



打印结果如下:
<blockquote>----pin mux iomap start.--------




使用特权

评论回复

相关帖子

沙发
丑小鸭丶|  楼主 | 2020-9-15 11:41 | 只看该作者
本帖最后由 丑小鸭丶 于 2020-9-15 14:55 编辑

代码如下:(因为用的QNX操作系统的库,有些函数说明如下)
mmap_device_io()函数为:地址映射函数。
in32()函数为:将寄存器里面的数值读取出来。
out32()函数为:将外面的变量的数值写入到寄存器中去。
bit0、bit1这种赋值方式为位域操作,直接给变量的对应位赋值0/1。如spi_pin->my_conf_mcasp0_aclkx.value.bit.bit0 = 1;表示给bit0赋值为1。

代码:
一、寄存器定义代码:
/* GPIO MUX */
#define AM437X_PIN_MUX_SIZE                     0x1000
#define CONTROL_MODULE_BASE                   0x44E10000
#define CTRL_CONF_MCASP0_ACLKX               ((CONTROL_MODULE_BASE) + (0x990))
#define CTRL_CONF_MCASP0_FSX                   ((CONTROL_MODULE_BASE) + (0x994))
#define CTRL_CONF_MCASP0_AXR0                 ((CONTROL_MODULE_BASE) + (0x998))

typedef struct {
    am437x_reg my_conf_mcasp0_aclkx;
    am437x_reg my_conf_mcasp0_fsx;
    am437x_reg my_conf_mcasp0_axr0;
} am437x_pin_mux;



二、功能代码:
    am437x_pin_mux *spi_pin

    /* 引脚复用 寄存器地址映射  pin mux io map */
    DEBUG_INFO("----pin mux iomap start.-----------\r\n");
    spi_pin->my_conf_mcasp0_aclkx.vaddr = mmap_device_io(AM437X_PIN_MUX_SIZE, CTRL_CONF_MCASP0_ACLKX);
    spi_pin->my_conf_mcasp0_fsx.vaddr   = mmap_device_io(AM437X_PIN_MUX_SIZE, CTRL_CONF_MCASP0_FSX);
    spi_pin->my_conf_mcasp0_axr0.vaddr  = mmap_device_io(AM437X_PIN_MUX_SIZE, CTRL_CONF_MCASP0_AXR0);
    if ((spi_pin->my_conf_mcasp0_aclkx.vaddr == (uintptr_t)MAP_FAILED) ||
        (spi_pin->my_conf_mcasp0_fsx.vaddr   == (uintptr_t)MAP_FAILED) ||
        (spi_pin->my_conf_mcasp0_axr0.vaddr  == (uintptr_t)MAP_FAILED)) {
        printf("io map failed\r\n");
        return ;
    }
    DEBUG_INFO("----pin mux iomap end.  -----------\r\n");

    /* spi对应引脚复用寄存器操作  pin mux */
    /* 1. sclk引脚复用寄存器  spi1_sclk */
    DEBUG_INFO("reg value = 0x%8x\r\n", in32(spi_pin->my_conf_mcasp0_aclkx.vaddr));

    spi_pin->my_conf_mcasp0_aclkx.value.all = in32(spi_pin->my_conf_mcasp0_aclkx.vaddr);
    spi_pin->my_conf_mcasp0_aclkx.value.bit.bit0 = 1;
    spi_pin->my_conf_mcasp0_aclkx.value.bit.bit1 = 1;
    spi_pin->my_conf_mcasp0_aclkx.value.bit.bit2 = 0;
    spi_pin->my_conf_mcasp0_aclkx.value.bit.bit3 = 0;
    out32(spi_pin->my_conf_mcasp0_aclkx.vaddr, spi_pin->my_conf_mcasp0_aclkx.value.all);

    DEBUG_INFO("value     = 0x%8x\r\n", spi_pin->my_conf_mcasp0_aclkx.value.all);
    DEBUG_INFO("reg value = 0x%8x\r\n", in32(spi_pin->my_conf_mcasp0_aclkx.vaddr));

    /* 2. spi1_d0引脚复用寄存器 */
    DEBUG_INFO("reg value = 0x%8x\r\n", in32(spi_pin->my_conf_mcasp0_fsx.vaddr));

    spi_pin->my_conf_mcasp0_fsx.value.all = in32(spi_pin->my_conf_mcasp0_fsx.vaddr);
    spi_pin->my_conf_mcasp0_fsx.value.bit.bit0 = 1;
    spi_pin->my_conf_mcasp0_fsx.value.bit.bit1 = 1;
    spi_pin->my_conf_mcasp0_fsx.value.bit.bit2 = 0;
    spi_pin->my_conf_mcasp0_fsx.value.bit.bit3 = 0;
    out32(spi_pin->my_conf_mcasp0_fsx.vaddr, spi_pin->my_conf_mcasp0_fsx.value.all);

    DEBUG_INFO("value     = 0x%8x\r\n", spi_pin->my_conf_mcasp0_fsx.value.all);
    DEBUG_INFO("reg value = 0x%8x\r\n", in32(spi_pin->my_conf_mcasp0_fsx.vaddr));

    /* 3. spi1_d1 引脚复用寄存器 */
    DEBUG_INFO("reg value = 0x%8x\r\n", in32(spi_pin->my_conf_mcasp0_axr0.vaddr));

    spi_pin->my_conf_mcasp0_axr0.value.all = in32(spi_pin->my_conf_mcasp0_axr0.vaddr);
    spi_pin->my_conf_mcasp0_axr0.value.bit.bit0 = 1;
    spi_pin->my_conf_mcasp0_axr0.value.bit.bit1 = 1;
    spi_pin->my_conf_mcasp0_axr0.value.bit.bit2 = 0;
    spi_pin->my_conf_mcasp0_axr0.value.bit.bit3 = 0;
    out32(spi_pin->my_conf_mcasp0_axr0.vaddr, spi_pin->my_conf_mcasp0_axr0.value.all);

    DEBUG_INFO("value     = 0x%8x\r\n", spi_pin->my_conf_mcasp0_axr0.value.all);
    DEBUG_INFO("reg value = 0x%8x\r\n", in32(spi_pin->my_conf_mcasp0_axr0.vaddr));

使用特权

评论回复
板凳
丑小鸭丶|  楼主 | 2020-9-15 11:42 | 只看该作者
本帖最后由 丑小鸭丶 于 2020-9-15 15:37 编辑

打印结果如下:
----pin mux iomap start.-----------
----pin mux iomap end.  -----------
reg value = 0x 8040007   //读取寄存器的初始值
value      = 0x 8040003   //要写入的寄存器的值
reg value = 0x 8040007  //读取寄存器的新值
reg value = 0x 8040007   //读取寄存器的初始值
value      = 0x 8040003   //要写入的寄存器的值
reg value = 0x 8040007  //读取寄存器的新值


reg value = 0x 8040007   //读取寄存器的初始值
value      = 0x 8040003   //要写入的寄存器的值
reg value = 0x 8040007  //读取寄存器的新值

使用特权

评论回复
地板
丑小鸭丶|  楼主 | 2020-9-15 17:11 | 只看该作者
最新情况 :手册中找到如下描述:
Note: For writing to the control module registers, the MPU will need to be in privileged mode of operation and writes will not work from user mode.

复用寄存器(控制寄存器)写不进去值,貌似是因为我处于用户模式,必须要切换到特权模式下才能写数据,那么如何切换到特权模式呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

9

帖子

0

粉丝