如题:
1、使用的芯片为am4378,
2、目前在实现spi1功能,QNX操作系统下,采用地址映射的方式操作寄存器。
3、在配置SPI1外设的pin引脚复用功能时,通过读取手册发现需要配置以下几个寄存器:
CTRL_CONF_MCASP0_ACLKX Register
CTRL_CONF_MCASP0_FSX Register
CTRL_CONF_MCASP0_AXR0 Register
4、在用户手册中寄存器控制章节查到对应几个寄存器的配置:可以配置bit0-bit3为spi模式
CTRL_CONF_MCASP0_ACLKX Register ---> 可以复用为:spi1_sclk ---> bitr0-bit3为:mode3 即:b0011
CTRL_CONF_MCASP0_FSX Register ---> 可以复用为:spi1_d0 ---> bitr0-bit3为:mode3 即:b0011
CTRL_CONF_MCASP0_AXR0 Register ---> 可以复用为:spi1_d1 ---> bitr0-bit3为:mode3 即:b0011
如图:
5、然后问题出现了:
(1)读取默认值,发现bit0-bit3是b0111,也就是GPIO模式;
(2)写入b0011到bit0-bit3中,想要复用为SPI模式;
(3)再读取该寄存器,发现写入失败,寄存器的值还是以前的b0111,并未切换成功。
跪求指点,感激不尽!!
代码如下:(备注:为了看起来简洁,把判错以及一些不相关的log代码删除了)
/* GPIO MUX */ #define AM437X_PIN_MUX_SIZE 0x1000 #define CONTROL_MODULE_BASE 0x44E10000 #define CTRL_STS ((CONTROL_MODULE_BASE) + (0x40)) #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 sts; am437x_reg conf_mcasp0_aclkx; am437x_reg conf_mcasp0_fsx; am437x_reg conf_mcasp0_axr0; } am437x_pin_mux;
void spi_pin_mux_init(am437x_pin_mux *spi_pin) { /* pin mux io map */ DEBUG_INFO("----pin mux iomap start.-----------\r\n"); spi_pin->conf_mcasp0_aclkx.vaddr = mmap_device_io(AM437X_PIN_MUX_SIZE, CTRL_CONF_MCASP0_ACLKX); spi_pin->conf_mcasp0_fsx.vaddr = mmap_device_io(AM437X_PIN_MUX_SIZE, CTRL_CONF_MCASP0_FSX); spi_pin->conf_mcasp0_axr0.vaddr = mmap_device_io(AM437X_PIN_MUX_SIZE, CTRL_CONF_MCASP0_AXR0); /* pin mux */ /* 1. spi1_sclk */ DEBUG_INFO("reg value = 0x%8x\r\n", in32(spi_pin->conf_mcasp0_aclkx.vaddr)); spi_pin->conf_mcasp0_aclkx.value.all = in32(spi_pin->conf_mcasp0_aclkx.vaddr); spi_pin->conf_mcasp0_aclkx.value.bit.bit0 = 1; spi_pin->conf_mcasp0_aclkx.value.bit.bit1 = 1; spi_pin->conf_mcasp0_aclkx.value.bit.bit2 = 0; spi_pin->conf_mcasp0_aclkx.value.bit.bit3 = 0; out32(spi_pin->conf_mcasp0_aclkx.vaddr, spi_pin->conf_mcasp0_aclkx.value.all); DEBUG_INFO("value = 0x%8x\r\n", spi_pin->conf_mcasp0_aclkx.value.all); DEBUG_INFO("reg value = 0x%8x\r\n", in32(spi_pin->conf_mcasp0_aclkx.vaddr)); /* 2. spi1_d0 */ DEBUG_INFO("reg value = 0x%8x\r\n", in32(spi_pin->conf_mcasp0_fsx.vaddr)); spi_pin->conf_mcasp0_fsx.value.all = in32(spi_pin->conf_mcasp0_fsx.vaddr); spi_pin->conf_mcasp0_fsx.value.bit.bit0 = 1; spi_pin->conf_mcasp0_fsx.value.bit.bit1 = 1; spi_pin->conf_mcasp0_fsx.value.bit.bit2 = 0; spi_pin->conf_mcasp0_fsx.value.bit.bit3 = 0; out32(spi_pin->conf_mcasp0_fsx.vaddr, spi_pin->conf_mcasp0_fsx.value.all); DEBUG_INFO("value = 0x%8x\r\n", spi_pin->conf_mcasp0_fsx.value.all); DEBUG_INFO("reg value = 0x%8x\r\n", in32(spi_pin->conf_mcasp0_fsx.vaddr)); /* 3. spi1_d1 */ DEBUG_INFO("reg value = 0x%8x\r\n", in32(spi_pin->conf_mcasp0_axr0.vaddr)); spi_pin->conf_mcasp0_axr0.value.all = in32(spi_pin->conf_mcasp0_axr0.vaddr); spi_pin->conf_mcasp0_axr0.value.bit.bit0 = 1; spi_pin->conf_mcasp0_axr0.value.bit.bit1 = 1; spi_pin->conf_mcasp0_axr0.value.bit.bit2 = 0; spi_pin->conf_mcasp0_axr0.value.bit.bit3 = 0; out32(spi_pin->conf_mcasp0_axr0.vaddr, spi_pin->conf_mcasp0_axr0.value.all); DEBUG_INFO("value = 0x%8x\r\n", spi_pin->conf_mcasp0_axr0.value.all); DEBUG_INFO("reg value = 0x%8x\r\n", in32(spi_pin->conf_mcasp0_axr0.vaddr)); }
打印结果如下:
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