免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5193 | 回复: 6
打印 上一主题 下一主题

[C] 求助,linux下gpio模拟spi读寄存器的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-18 09:48 |只看该作者 |倒序浏览
紧急求助,gpio口模拟spi读数据的问题,写数据都没问题了,读00h的数据输出的都是1,不知道怎么回事
gpio定义和spi的都不说了,写寄存器没有问题,读寄存器到底怎么回事呢?请大虾帮忙看看

/*这是写寄存器的代码段*/
static void gpio_lcd_emuspi_write_one_para(unsigned short addr, unsigned short para)
{
        unsigned int i;
        int j;

        i = addr | 0x700000;
        gpio_direction_output(spi_cs, 0);
        /*udelay(4);*/

        for (j = 0; j < 24; j++) {

                if (i & 0x800000)
                        gpio_direction_output(spi_sdo, 1);       
                else
                        gpio_direction_output(spi_sdo, 0);       

                gpio_direction_output(spi_sclk, 0);       
                /*udelay(4);*/
                gpio_direction_output(spi_sclk, 1);       
                /*udelay(4);*/
                i <<= 1;
        }
        gpio_direction_output(spi_cs, 1);
        /*udelay(4);*/

        i = para | 0x720000;
        gpio_direction_output(spi_cs, 0);
        /*udelay(4);*/
        for (j = 0; j < 24; j++) {

                if (i & 0x800000)
                        gpio_direction_output(spi_sdo, 1);
                else
                        gpio_direction_output(spi_sdo, 0);

                gpio_direction_output(spi_sclk, 0);       
                /*udelay(4);*/
                gpio_direction_output(spi_sclk, 1);
                /*udelay(4);*/
                i <<= 1;
        }
        gpio_direction_output(spi_cs, 1);

}

/*这是读寄存器的代码段*/
static void gpio_lcd_emuspi_read_one_para(unsigned short addr, uint32 *data)
{
        unsigned int i;
        int j,ret;
        uint32 dbit,bits;
        i = addr | 0x700000;
        gpio_direction_output(spi_cs, 0);
        /*udelay(4);*/

        for (j = 0; j < 24; j++) {

                if (i & 0x800000)
                        gpio_direction_output(spi_sdo, 1);       
                else
                        gpio_direction_output(spi_sdo, 0);       

                gpio_direction_output(spi_sclk, 0);       
                /*udelay(4);*/
                gpio_direction_output(spi_sclk, 1);       
                /*udelay(4);*/
                i <<= 1;
        }
        gpio_direction_output(spi_cs, 1);
        /*udelay(4);*/

        ret = gpio_direction_input(spi_sdo);
        gpio_direction_output(spi_cs, 0);
        //udelay(40);
        bits=0;
        for (j = 0; j < 8; j++) {

                bits<<= 1;
                gpio_direction_output(spi_sclk, 1);
                gpio_direction_output(spi_sclk, 0);
                udelay(10);
                dbit=gpio_get_value(spi_sdo);
                //udelay(45);
               
                //bits = 2*bits+dbit;
                bits|=dbit;
               
        }
        *data = bits;
        gpio_direction_output(spi_cs, 1);

}

datesheet中是在sclk的上升沿读spi的数据的,是不是读程序哪里出问题了?请高手帮忙

论坛徽章:
0
2 [报告]
发表于 2009-11-18 09:48 |只看该作者
顶起,期待高手帮忙,跪谢!~~~

论坛徽章:
0
3 [报告]
发表于 2009-11-18 09:50 |只看该作者
读寄存器的那段是模仿写的那段改的,看来是改错了,可能是gpio_direction_input或者gpio_get_value使用不对,延时应该没问题的,请大家帮帮忙看看

论坛徽章:
0
4 [报告]
发表于 2009-11-18 10:05 |只看该作者
顶起,求助好心人!~~~~

论坛徽章:
0
5 [报告]
发表于 2009-11-18 10:51 |只看该作者
gpio口设置和spi的初始化都应该没问题的,写数据能写进去,不晓得哪里出问题了,有没有高手帮帮忙啊!~~~跪谢

论坛徽章:
0
6 [报告]
发表于 2009-11-18 14:12 |只看该作者
没人来自己顶起,hoho!~~~

应该是spi输出没设置对或者功能没打开。。。。有人没?

论坛徽章:
0
7 [报告]
发表于 2009-11-20 01:52 |只看该作者
建议你到 Linux 论坛的嵌入式板块进行提问,这里主要是 general topics on C/C++ with Linux/Unix,因为技术的原因帖子暂时转不过去,抱歉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP