在LINUX 2.6下写了一个简单的SPI口驱动,
在驱动中遇到奇怪的问题,请大家帮忙指点:
在2410的驱动程序中初始化SPI0的过程如下:
1)时使能S3C2410_CLKCON中的SPI位;
2)设置与SPI0有关的GPIO口,并将相应的PULL UP位设置为1;
3)预想将SPI设置为SLAVE,POLLING模式,所以对SPCON0写值:0x00;
至此,初始化完毕。
初始化后,遇到的问题如下:
1)发现SPSTA0中的REDY位始终为0,如对SPTSAT0写如一个字节,SPSTA0寄存器的返回值是4,即DCOL位置位;
2)如果通过前端DSP对2410的MOSI写入一个字节的数据,则在SPRDAT0中可以读到相应的值,但是REDY位依然还是0;
请问我的初始化过程是否有问题?
为什么REDY位始终为0?问题在哪里啊?谢谢。
我对SPI口的SLAVE模式接收数据的过程理解是:
首先REDY位应该是1,要想收数据,首先对SPTSAT0写入一个字节,此时REDY清零,等待主机发送数据,如果此时主机发送一个字节的数据到SLAVE,则REDY置1,此时读取SPRDAT0则可得到输入的数据.
我的SPI接口初始化程序,请大家帮我看看哪里的问题:
//使能系统时钟可以进入SPI模块
writel(readl(S3C2410_CLKCON)|SPI_INTERNAL_CLOCK_ENABLE,S3C2410_CLKCON
//配置SPI0所需要使用的IO口的功能
s3c2410_gpio_cfgpin(S3C2410_GPG2,S3C2410_GPG2_NSS0);
s3c2410_gpio_cfgpin(S3C2410_GPE11,S3C2410_GPE11_SPIMISO0);
s3c2410_gpio_cfgpin(S3C2410_GPE12,S3C2410_GPE12_SPIMOSI0);
s3c2410_gpio_cfgpin(S3C2410_GPE13,S3C2410_GPE13_SPICLK0);
//向所需IO口的PULL UP寄存器写1
s3c2410_gpio_pullup(S3C2410_GPG2,1);
s3c2410_gpio_pullup(S3C2410_GPE11,1);
s3c2410_gpio_pullup(S3C2410_GPE12,1);
s3c2410_gpio_pullup(S3C2410_GPE13,1);
//将SPI配置成SLAVE,POLLING,对SPCON0写0;
writel(0x00000000,spcon0);
至此初始化完毕
可是在此时读取SPSTA0的状态,REDY位为0,而不为1,不知道是什么原因。请高手指点
不知道楼主解决了这个问题没?我也遇到了这个问题,正头疼呢!
望赐教!
我的SPI口,没有时钟波形,我是配置的2410SPI为主模式的
为什么楼主的SPI口要禁止上拉呢?这一点不太清楚,可否指点 一下,谢谢
你好~ 不知道楼主解决了这个问题没?我刚刚写了一个类似程序也遇到了这个问题,正头疼呢!
望赐教!
好久不来了,问题早解决了,对最后一个寄存器的赋值赋错了,呵呵,datasheet没看清楚。当时对寄存器的写值参考的一个网上的blog,那个blog里面提到的寄存器的写值问题比较多。
2.6内核有s3c2410现成的SPI控制器驱动(drivers/spi/spi_s3c24xx.c),为何要自己写?
我用最新的2.6.25内核,SPI工作很正常。
请问zgz:
使用linux自带的spi_s3c24xx.c驱动后,/dev无法找到自动创建的接点,/proc/devices中也没有,但是把spidev.c文件编译模块后,/proc/devices中就有了major=153的设备了,,?/QQ:70438592,不吝赐教!
spi_s3c24xx.c本身并没有生成设备节点,spidev.c的任务就是为了再user space访问spi设备而设,就是通过它来进行spi设备的读写。详细方法请阅读内核Documents/spi目录下的例子。
感谢zgz:
在加载spidev.ko后,生成spidev0.1 153 0接点了