如题:
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


