打印

高手看过来:奇特的SPI接口程序

[复制链接]
3192|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lwg998|  楼主 | 2010-5-31 16:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
高手看过来:奇特的SPI接口程序
由于项目的需要现在要用模拟的SPI口向一个屏的寄存器
内写命令和数据,而数据寄存器有5位的,7位和8位,而
屏要求SPI程序一次必须写入8位数据,现在遇到的问题是
写入5位和7位寄存器的数据后再读出发现高4位的数据丢
失,而写入8位寄存器的数据读出却正确,特向高手请教
该如何解决?谢谢

相关帖子

沙发
maomao2126| | 2010-5-31 19:24 | 只看该作者
没明白楼主的意思

既然屏要求一次写8位,那就按照8位来写。高位补0即可,
一般屏的SPI时序都是要求高位先发送,低位后发送。
有没有时序图贴上来看看,估计楼主这部分理解错了

使用特权

评论回复
板凳
lwg998|  楼主 | 2010-6-1 11:55 | 只看该作者
见波形图,根据SPI要求的时序,地址位左移一位,发送0x0423  ,实际波形应该是0823,但写入后读出只能是0x0903

0823.JPG (87.39 KB )

0823.JPG

spi.JPG (21.18 KB )

spi.JPG

0423.JPG (88.38 KB )

0423.JPG

使用特权

评论回复
地板
lwg998|  楼主 | 2010-6-1 12:19 | 只看该作者
0x08 是地址,根据时序表 发的实际地址左移一位,实际要发的地址是0x04。
23:是发的数据。

jcq.JPG (107.29 KB )

向这样的寄存器最高位D7无,写入的数据和读出的高位就会丢失,写入0x0823,读出是0x0903 ...

向这样的寄存器最高位D7无,写入的数据和读出的高位就会丢失,写入0x0823,读出是0x0903 ...

0x08.JPG (102.14 KB )

像这样的D0-D7都有的,写入和读出都是正确的。写入0x08ff,读出是0X09FF

像这样的D0-D7都有的,写入和读出都是正确的。写入0x08ff,读出是0X09FF

使用特权

评论回复
5
lwg998|  楼主 | 2010-6-1 12:23 | 只看该作者
所以问题就是,凡寄存器8位全的,写入和读出都正确,凡寄存器8位不全的写入不正确。读函数可以正确读出芯片默认的数值,证明读函数是正确的。

08ff.JPG (38.4 KB )

D0-D7都有的寄存器写入0x08ff,读出的是0x09ff,写入和读出是一致的,是正确的

D0-D7都有的寄存器写入0x08ff,读出的是0x09ff,写入和读出是一致的,是正确的

使用特权

评论回复
6
lwg998|  楼主 | 2010-6-1 12:29 | 只看该作者
以下是我的读写函数,请高手拍砖
#define write 0xfe                 //最低位保证为0则为写命令
#define read  0x01               //最低位保证是1则为读命令

void WriteSPI(unsigned char index, Parameter)
{         unsigned char data i,temp;
    temp=index<<1&write;
        SPI_CS=1;
        SPI_SCL=1;
    SPI_CS=0;
        delay_ms(2);
for(i=0x80;i!=0;i/=2)       //发送地址码和写命令
        {        //SPI_SCL=0;
                //SPI_CS=0;
                //SPI_SDA=index&i;
                SPI_SDA=temp&i;
                SPI_SCL=0;
                delay_ms(3);
                SPI_SCL=1;       
                delay_ms(2);
        }
       
//  delay_ms(5);
for(i=0x80;i!=0;i/=2)          //先高后低,写数据
        {       
               
        //        SPI_SCL=0;

                SPI_SDA=Parameter&i;
                SPI_SCL=0;
                delay_ms(3);
                SPI_SCL=1;
                delay_ms(2);       
        }                  
    delay_ms(2);
    SPI_CS=1;

}



unsigned char ReadSPI(unsigned char index)
{   unsigned char i,temp,temp2=0;
    temp=index<<1|read;         
          
        SPI_CS=1;
        SPI_SCL=1;
    SPI_CS=0;
        delay_ms(1);
for(i=0x80;i!=0;i/=2)
        {        //SPI_SCL=0;
       
                SPI_SDA=temp&i;
                //delay_ms(1);
                SPI_SCL=0;
                delay_ms(3);
                SPI_SCL=1;
                delay_ms(2);       
        }
                 
        for(i=8;i>0;i--)
        {       
               
                SPI_SCL=0;
                       
                temp2<<=1;
                                temp2|=SPI_SDA;
               
                //delay_ms(1);
                //SPI_SCL=0;
                delay_ms(3);
                SPI_SCL=1;
                delay_ms(2);         //5
               
        }       
        delay_ms(2);         //5
        SPI_CS=1;
        return  temp2;
}

使用特权

评论回复
7
maomao2126| | 2010-6-1 14:07 | 只看该作者
那就比较奇怪了,你这是哪款屏?
主要看看 读的时候 SCL建立时间,高电平时间及数据的稳定时间是不是满足SPEC要求

使用特权

评论回复
8
lwg998|  楼主 | 2010-6-2 14:28 | 只看该作者
读和写的时间基本是一致的,唯一的区别就是高8位的最低位是控制读写的,R/W
按道理可以读出芯片默认的数值基本可以说明读函数是没有问题的。而写函数也可以验证时正确的,因为按5楼的写法,写入0XFF到0x08nag寄存器,读出的就是正确的。

使用特权

评论回复
9
lwg998|  楼主 | 2010-6-3 12:14 | 只看该作者
顶起来,让更多的朋友关注一下。如果需要这个屏的资料可以找我,我的QQ:104015445   验证:OLED

使用特权

评论回复
10
lwg998|  楼主 | 2010-6-13 15:14 | 只看该作者
自己过来顶起来,直到有高手出现。

使用特权

评论回复
11
lwg998|  楼主 | 2010-6-23 16:13 | 只看该作者
继续顶上来

使用特权

评论回复
12
zchong| | 2010-6-27 09:41 | 只看该作者
程序没看,讲讲你是如何写和如何读的吧

使用特权

评论回复
13
win_today| | 2010-7-5 15:35 | 只看该作者
没有仔细研究过SPI写的函数,貌似你在用奇景的方案,点TCON屏,联系代理好了

使用特权

评论回复
14
牛牛特工| | 2010-7-7 19:28 | 只看该作者
:lol~~~ 赠送块给俺调调

使用特权

评论回复
15
牛牛特工| | 2010-7-7 19:37 | 只看该作者
这个时序和命名方式不是SPI 应该是I2C
SPI的收和发分别是两根数据线  一个DI(输入) 一个DO(输出) 或 MISO MOSI  SCLK CS
I2C 则通常为SDA SCL  DA是双向的 最低位为R/W 也是I2C的习惯
建议按照I2C的思路重新写了 可能是DataSheet上的错误

使用特权

评论回复
16
牛牛特工| | 2010-7-7 19:37 | 只看该作者
俺是在楼主的群混过段时间滴 :lol 就是么买过东西

使用特权

评论回复
17
lwg998|  楼主 | 2010-7-7 21:07 | 只看该作者
绝对不是IIC,看楼上的那个时序就明白了,后来我也和几个朋友聊过,读数据并不是函数的问题,而是这个屏驱动IC的问题。我现在已经点亮了,效果很好。

使用特权

评论回复
18
airwill| | 2010-7-28 12:23 | 只看该作者
我初步看了下, 感觉这是模拟 SPI 的时序出了问题,  注意 SCK 在 SPI 开始时的初始值.
不处理好的话, 就会错误地(过多)移位.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:OLED显示模块淘宝专卖:http://shop33090300.taobao.com OLED显示技术QQ群:81786560 加入本QQ群请输入验证:OLED

13

主题

143

帖子

0

粉丝