Chinaunix

标题: SPI驱动的调用问题 [打印本页]

作者: yjz98    时间: 2009-06-04 21:19
标题: SPI驱动的调用问题
在2.4下面调用SPI驱动进行数据传送,用以下的方式打开spi设备,然后直接调用读写函数。结果提示无法打开设备
testSPI = open("/dev/spi",O_RDWR,O_NDELAY); if ( testSPI == -1 )
{
        printf("Cann't open device spi \n");
        return 0;
}
当用testSPI = open("/dev/spi",0,O_RDWR,O_NDELAY);时可以没有报错打不开设备。0可以为1,2,3

当用testSPI = open("/dev/spi/0",O_RDWR,O_NDELAY);时可以没有报错打不开设备。
这种情况下能检测到NPCS0上的片选波形和SPCK波形,可是在执行write的情况下,MOSI同样没有输出,这是怎么回事?


在linux下查看用ls命令dev目录,显示如下
[root@AT91RM9200DK /dev]$ls
spi
用ls -l spi命令显示如下:
[root@AT91RM9200DK /dev]$ls -l spi
crw-------    1 root     root    153,   0 Jan  1 00:00 0
crw-------    1 root     root    153,   1 Jan  1 00:00 1
crw-------    1 root     root    153,   2 Jan  1 00:00 2
crw-------    1 root     root    153,   3 Jan  1 00:00 3

用上面的方式写了个程序打开设备,再读写,然后用示波器看SPI片选波形,什么么都没有,压根没任何反映。这是怎么回事啊?

疑惑:
1,次设备号需要这么传进去吗?还是这个0根本在这部代表次设备号?open("/dev/spi",0,O_RDWR,O_NDELAY);
2,总觉得调用spi总得对它进行必要的配置吧,驱动也应该以ioctl的形式提供一个接口啊,可是看了哈驱动里面什么都没有
static int spidev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
        int spi_device = MINOR(inode->i_rdev);

        if (spi_device >= NR_SPI_DEVICES)
                return -ENODEV;

       
        switch(cmd) {
                default:
                        return -ENOIOCTLCMD;
        }
}

请各位高手指点指点!谢谢各位了!

[ 本帖最后由 yjz98 于 2009-6-4 22:13 编辑 ]
作者: lpzgbd    时间: 2009-06-07 21:26
原帖由 yjz98 于 2009-6-4 21:19 发表
在2.4下面调用SPI驱动进行数据传送,用以下的方式打开spi设备,然后直接调用读写函数。结果提示无法打开设备。
testSPI = open("/dev/spi",O_RDWR,O_NDELAY); if ( testSPI == -1 )
{
        printf("Cann't open  ...

根本没有这个设备,怎么能打开呢。


“当用testSPI = open("/dev/spi",0,O_RDWR,O_NDELAY);时可以没有报错打不开设备。0可以为1,2,3“
这个调用有点奇怪,第二个参数能为0吗?第三个参数能为O_RDWR吗,怎么还有第四个参数?

“当用testSPI = open("/dev/spi/0",O_RDWR,O_NDELAY);时可以没有报错打不开设备。
这种情况下能检测到NPCS0上的片选波形和SPCK波形,可是在执行write的情况下,MOSI同样没有输出,这是怎么回事?”
这里应该写作O_RDWR|O_NDELAY吧,至于为什么没有输出,就不清楚了,你可以跟踪一下驱动看看呀。

“疑惑:
"1,次设备号需要这么传进去吗?还是这个0根本在这部代表次设备号?open("/dev/spi",0,O_RDWR,O_NDELAY);”
应用程直接打开/dev/spi/*就行了吧,不需要去关心此设备号。

"2,总觉得调用spi总得对它进行必要的配置吧,驱动也应该以ioctl的形式提供一个接口啊,可是看了哈驱动里面什么都没有"

驱动的init函数里应该作为初始化的吧。
作者: crifan    时间: 2009-06-09 16:48
1.关于用应用程序去调用open去打开一个(设备)文件,
我以前用过的open,只是传入了两个参数,比如:
consoleFile = open("/dev/console", O_RDWR);
是可以正常工作的。

在没看你的问题之前,还真不知道open是有更多的参数的。
刚刚去百度了一下,open函数的说明,一共有3个参数的,你看看:
http://jpkc.whu.edu.cn/jpkc2005/alprogram/jpkc/ckzl/zl/TC20库函数/tc20functiono.htm

你可以按照我上面的用法,只给2个参数,应该也是可以工作的,至少我这里打开其他文件是可以的。

2.
对于设备号的事情,只有在你用终端(命令行下)
用mkond 去创建设备的节点,才会涉及
而你此处去调用open函数,是属于应用层的,只关系文件系统提供给你的文件,与设备号无关,你只关心文件路径和文件名。

3.
驱动程序里面,是否实现ioctl,取决于程序开发者,
看其是否打算给你上层应用程序,提供的对应的命令去做一些事情。
很多驱动,其实是不需要的,因为其他普通的read,write等功能已经足够上层对此设备的操作了。

4.刚看到,根据你上面的
[root@AT91RM9200DK /dev]$ls
spi
用ls -l spi命令显示如下:
[root@AT91RM9200DK /dev]$ls -l spi
crw-------    1 root     root    153,   0 Jan  1 00:00 0
crw-------    1 root     root    153,   1 Jan  1 00:00 1
crw-------    1 root     root    153,   2 Jan  1 00:00 2
crw-------    1 root     root    153,   3 Jan  1 00:00 3

看起来,你是spi是/dev下面的一个目录,而不是文件啊,
我的理解是,打开文件夹,文件系统对该文件夹的访问,对应到底层操作,无法对应上物理设备。
你要打开,应该打开对应建立的文件,底层才对应具体设备的。

所以你去试试打开/dev/spi/0 试一试。

还有一点奇怪的是,你/dev 下面,为何只有一个spi设备???
正常的系统,怎么说也有很多其他必需的设备,比如 console,tty等等。
作者: yjz98    时间: 2009-06-10 15:04
标题: 回复 #3 crifan 的帖子
"还有一点奇怪的是,你/dev 下面,为何只有一个spi设备???
正常的系统,怎么说也有很多其他必需的设备,比如 console,tty等等。"
你感到奇怪就对了,我是为了让帖子看起来更简单点,当然有其它的了,只是都跟spi没关系,所以没贴出来。
谢谢你,“试试打开/dev/spi/0”我按照这种方法试过,都检测到了片选和时钟信号,就是没看到数据输出,很纳闷。
用printk调试,发现调用过程中
open spi1 succesfully!//应用层打开成功表示
SPI on                        //驱动层打开设备
SPI transfer start [3] //驱动层开始传输
SPI interrupt 0           //估计是一次中断传输一页(不怎么懂)
SPI interrupt 0
SPI interrupt 0
SPI transfer end        //驱动层传输结束
SPI off                        //驱动层关闭设备

分明显示出是调用过了驱动层中的读写函数了,可是为什么检测不到数据输出呢?

[ 本帖最后由 yjz98 于 2009-6-10 17:11 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2