在uboot下采用SPI与MCU通信,在MCU侧通过cw调试,发现uboot下通过spi写数据到MCU正常,而通过SPI读数据,则发现读到的数据全为0。
spi写代码如下:
dev =(0X1 << 1) | 0X0;
val = 0x12345678;
memset(&senddata,0,sizeof(senddata));
memcpy(&senddata[0],&dev,2);
memcpy(&senddata[2],&val,4);
bitlen = sizeof(senddata)*8;
dout = &senddata; din = NULL;
if(spi_xfer(spi1, bitlen, dout, din,SPI_XFER_BEGIN | SPI_XFER_END) != 0)
{
printf("1 Error during SPI transaction\n");
return;
}
但是,读spi数据就会出现全0,读代码如下所示:
dev =0x55aa;
val = 0x12345678;
memset(&senddata,0,sizeof(senddata));
memcpy(&senddata[0],&dev,2);
memcpy(&senddata[2],&val,4);
memset(&recdata,1,sizeof(senddata));
bitlen = sizeof(senddata)*8;
dout = NULL;
din = &recdata;
udelay(30000);
printf("test 3\n");
#if 1
if(spi_xfer(spi1, bitlen, dout, din,SPI_XFER_BEGIN | SPI_XFER_END) != 0)
{
printf("3 Error during SPI transaction\n");
return;
}
可以确定的是mcu侧的spi配置和通信没有问题。因为我通过内核的spi接口,读写mcu数据都正常。
读数据还尝试过将din和dou全部赋值,让spi_xfer调用底层的omap3_trxr接口,也存在同样的问题。
通过示波器抓波形,发现传输的数据也是错误的,但是不是为0,并且调用trtx接口传输数据的时候,发送
6个字节的数据,只接收到8个时钟,丢了其中的5个时钟。
还望各位大神能够指点一二,在此先谢过了。。。。。。。
Steven Liu1:
看你上面的描述,是内核下可以正常工作,但是uboot下现在不正常是吧。而且是收不正常,发正常。
你需要明确一点,uboot和kernel下面对这部分的配置是独立开的,uboot会进行一次配置,kernel也会再次初始化。这部分经常忽略的一个因素就是pinmux的配置,你确定在uboot下面你所使用的接收通道pinmux的配置是正确的吗?有没有配置成为正确的模式?是否有打开receive enable?
建议通过control module寄存器的相关地址查验pinmux的设置是否正常。
wrty:
你好,看到你的帖子,通过内核的spi接口,读写mcu数据都正常。
请问一下你的SPI怎么设置的,我通过Linux用户空间读写mcu数据都不正常,你的SPI驱动pin_MUX怎么设置的?用户空间的程序怎么写的?我是用的Linux文档中的SPI使用示例实验的
谢谢!
Jian Zhou:
回复 wrty:
对于Linux空间下的SPI设备读写部分,请参考下下面这个帖子,比较有代表意义:
http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/p/70989/170742.aspx#170742
wrty:
回复 Jian Zhou:
谢谢,确实很有用