我的核心板是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
怎么去设置?该去驱动改?
求大神救救,真不知道我这个处女座心态外加强迫症的渣渣怎么提升能力。。。。呜呜。。。
