各位好。
我们使用的是am3352,linux版本为4.9.28,使用SPI0外接一个串口转换芯片后,测试信号发现此SPI0的CS引脚一直处于低电平状态,通过SPI0来读写外接芯片的寄存器,监控CS引脚信号无变化,CLK、MOSI、MISO引脚有信号,这里想问下,为何CS引脚信号会持续为低?我在omap2_mcspi_set_enable函数中添加打印,观察入参enable变化,发现这个函数的入参enable在读取寄存器是会有1->0->1的变化,也就是OMAP2_MCSPI_CHCTRL0寄存器的bit 0是变化的,但是无法控制CS。
static void omap2_mcspi_set_enable(const struct spi_device *spi, int enable)
{
struct omap2_mcspi_cs *cs = spi->controller_state;
u32 l,i;
printk("enable=%d\n",enable);
l = cs->chctrl0;
if (enable)
l |= OMAP2_MCSPI_CHCTRL_EN;
else
l &= ~OMAP2_MCSPI_CHCTRL_EN;
cs->chctrl0 = l;
mcspi_write_cs_reg(spi, OMAP2_MCSPI_CHCTRL0, cs->chctrl0);
/* Flash post-writes */
printk("%x\n",mcspi_read_cs_reg(spi, OMAP2_MCSPI_CHCTRL0));
}
下面是设备树中spi0的配置:
spi0_pins:pinmux_spi0_pins {
pinctrl-single,pins = <
AM33XX_IOPAD(0x950, PIN_INPUT_PULLUP | MUX_MODE0) /* spi0_sclk.spi0_sclk */
AM33XX_IOPAD(0x954, PIN_INPUT_PULLUP | MUX_MODE0) /* spi0_d0.spi0_d0 */
AM33XX_IOPAD(0x958, PIN_INPUT_PULLUP | MUX_MODE0) /* spi0_d1.spi0_d1 */
AM33XX_IOPAD(0x95C, PIN_INPUT_PULLUP | MUX_MODE0) /* spi0_cs0.spi0_cs0 */
/*SPI0_IRQ*/
AM33XX_IOPAD(0x97C, PIN_INPUT_PULLUP | MUX_MODE7) /* uart1_rtsn.gpio0_13 */
/*SPI0_RST*/
AM33XX_IOPAD(0x964, PIN_OUTPUT_PULLUP | MUX_MODE7) /* ecap0_in_pwm0_out.gpio0_7 */
>;
};
yongqing wang:
参考一下这篇文章对SPI的配置:www.baidu.com/link
LONGFEI LI1:
OMAP2_MCSPI_CHCTRL0的bit 0的作用是使能spi0通道,OMAP2_MCSPI_CHCONF0寄存器的bit 20(FORCE)和bit 6(EPOL)共同决定CS片选信号是高电平还是低电平,下面是FORCE位的解释:
Manual SPIEN assertion to keep SPIEN active between SPI words. (single channel master mode only)
Writing 0 into this bit drives the SPIEN line when MCSPI_CHCONF(i)[EPOL]=0, and drives it high when
MCSPI_CHCONF(i)[EPOL]=1.
Writing 1 into this bit drives the SPIEN line when MCSPI_CHCONF(i)[EPOL]=0, and drives it low when
MCSPI_CHCONF(i)[EPOL]=1
也就是EPOL为1时,当FORCE=0,则CS引脚为高电平;FORCE=1,则CS为低电平。通过在mcspi_write_chconf0函数中添加打印测试发现,系统启动后最终设置OMAP2_MCSPI_CHCONF0寄存器的FORCE位为1,也就解释了为何上电后SPI0的CS片选信号一直处于低电平了。正常情况下如果没有使用SPI0去访问总线上的从设备的话CS信号应该为高电平(不选中状态)吧,3.2版本的内核中是这样的逻辑。需要访问spi从设备的时候才需要将cs引脚变成低电平才对。所以请TI的大侠们看看是否SPI驱动有问题?