This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM335x的SPI相关问题,求大神解答



我的核心板是am335x,内核是3.2版的

可是有个关于SPI的时钟的相位(CPOL)和极性(CPHA)的问题,对于其他论坛上说的这么设置去操作

ioctl(fd, SPI_IOC_WR_MODE,&mode);
ioctl(fd, SPI_IOC_RD_MODE,&mode);
ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);

可是,我用示波器显示却是这样子的:

(上面那个是数据线:输出信号:0xaaaa;下面那个是时钟信号)

(其中我也不知道我是不是接错了:数据线-地    时钟-地)

我看到驱动是这么写的:

#define SPI_CPHA 0x01 /* clock phase */ 
#define SPI_CPOL 0x02 /* clock polarity */ 
#define SPI_MODE_0 (0|0) /* (original MicroWire) */
#define SPI_MODE_1 (0|SPI_CPHA) 
#define SPI_MODE_2 (SPI_CPOL|0) 
#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)

那么问题来了:

1、如果按照我的想法是如果我改变模式,其时钟信号不是得改变么?可是我从模式0~3依次用ioctl切换再用示波器去测的时候就永远这样的图形(我的图就是发送的一个切图放大),好像时钟一直没改变,什么第一个跳变沿什么第二个跳变沿什么的都没体现出来,永远只有这个图,Why?是我没设置到?还是有其他方法可以测得到?

uint8_t mode=SPI_MODE_3;
cc=ioctl(fd,SPI_IOC_RD_MODE,&mode);
printf("cc=%d\n",cc);
cc=ioctl(fd,SPI_IOC_WR_MODE,&mode);
printf("cc=%d\n",cc);
//返回值依旧是0

2、我还有两片单片机,单片机那边设置好SPI后都能收发,我用ARM能自发自收,当中,我按照教程去设置CPOL和CPHA的模式以及位大小和频率什么的(两边都设好了),可是收到的数据就不是我所发的数据,有时候错位,有时候乱码。(当然,还有个前提,ARM之前以8bit和单片机都能同时收发,现在是换成16bit就不行,Why?)

 int bit=16;
cc=ioctl(fd,SPI_IOC_RD_BITS_PER_WORD,&bit);
printf("cc=%d\n",cc);
cc=ioctl(fd,SPI_IOC_WR_BITS_PER_WORD,&bit);
printf("cc=%d\n",cc);
 int speed=10000;
cc=ioctl(fd,SPI_IOC_RD_MAX_SPEED_HZ,&speed);
printf("cc=%d\n",cc);
cc=ioctl(fd,SPI_IOC_WR_MAX_SPEED_HZ,&speed);
printf("cc=%d\n",cc);
//返回值依旧是0

3、我怎么去设置主从机?驱动的选择模式压根就没给出怎么去设置SPI的主从机呀,类似于这样的:

SPI_IOC_RD_BITS_PER_WORD
SPI_IOC_RD_MODE
怎么去设置?该去驱动改?
求大神救救,真不知道我这个处女座心态外加强迫症的渣渣怎么提升能力。。。。呜呜。。。