打印

SPI的问题

[复制链接]
5531|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wuming1106|  楼主 | 2008-9-20 21:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
spi, pc, ov, HC, AN
我的SPI的问题请教下高手~我也用万用表,一一对应了IO口,看IO口的输出是不是和我程序一样,碰到的问题是?我前面发送进去的数据,读出来却不是这个数据,请教下高手~
时序图(如图)
程序:;==========================接受数据======================================================================
SJJS:                    MOV        A,00000011B        ;PC(中断/数据线)输入
                        MOV        PCC,A        
                        MOV        A,8
                        MOV        XHCS_8,A        ;循环次数8次
                START:    SET        PB.0            ;时钟频率置高电平
                        NOP
                        NOP
                        CLR        PB.0            ;时钟频率置低电平
                        SZ        PC.0            ;判断数据线数据
                        JMP        JIA                ;PC.0=1    
                        JMP        JIAN            ;PC.0=0
                JIA:    SET        SJCC_8.7        ;SJCC_8.7=1
                        JMP        BACK            ;跳到左移
                JIAN:    CLR        SJCC_8.7        ;SJCC_8.7=0
                BACK:    RL        SJCC_8            ;左移数据
                        SDZ        XHCS_8            ;判断到8次没
                        JMP        START            ;XHCS_8≠0            
                        RET
                        
                    
;==========================发送数据========================================    
SJFS:                    MOV        A,00000010B    ;PC(中断输入/数据线输出)
                        MOV        PCC,A
                        MOV        A,8
                        MOV        XHCS_8,A    ;循环次数8次
                START1:    SZ    SJCC_8.7    ;判断发送数据最高位
                        JMP    JIA1        ;SJCC_8.7=1    
                        JMP    JIAN1        ;SJCC_8.7=0
                JIA1:    SET    PC.0        ;PC.0=1
                        JMP    BACK1        ;跳到左移
                JIAN1:    CLR    PC.0        ;PC.0=0
                BACK1:    RL    SJCC_8        ;左移数据
                        SET        PB.0        ;时钟频率置高电平
                        NOP
                        NOP
                        CLR        PB.0        ;时钟频率置低电平
                        SDZ        XHCS_8        ;判断到8次了没
                        JMP        START1        ;XHCS_8≠0    

相关帖子

沙发
wuming1106|  楼主 | 2008-9-20 22:09 | 只看该作者

顶~~~

顶~~~~~请教高手~

使用特权

评论回复
板凳
wuming1106|  楼主 | 2008-9-20 22:17 | 只看该作者

哪位高手帮帮忙啊~

急啊~

使用特权

评论回复
地板
xuyaqi| | 2008-9-21 10:51 | 只看该作者

没看明白你用的是什么CPU。

使用特权

评论回复
5
lyjian| | 2008-9-21 12:02 | 只看该作者

用的是什么CPU,控制什么芯片也得说清楚吧?

使用特权

评论回复
6
tyw| | 2008-9-21 13:54 | 只看该作者

要用示波器看哦

SPI是一个环形总线结构由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
      假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。
      那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿到来的时候,sdi上的电平将所存到寄存器中去,那么这时寄存器=0101010sdi,这样在8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序。
      例子:
      假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据 

脉冲主机sbuff 从机sbuff sdi sdo 
0101010100101010100
1上0101010x1010101x01
1下010101001010101101
2上1010100x 0101011x10
2下101010010101011010
3上0101001x1010110x01
3下010100101010110101
4上1010010x0101101x10
4下101001010101101010
5上0100101x1011010x01
5下010010101011010101
6上1001010x0110101x10
6下100101010110101010
7上0010101x1101010x01
7下001010101101010101
8上0101010x1010101x10
8下010101011010101010



这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的名准备数据,主机在下一个8位时钟周期才把数据读回来 
SPI 总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。图3示出SPI总线工作的四种方式,其中使用的最为广泛的是SPI0和SPI3方式(实线表示):


图2   SPI总线四种工作方式 

SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设音时钟相位和极性应该一致。SPI接口时序如图3、图4所示。
二,.SPI功能模块的设计
根据功能定义及SPI的工作原理,将整个IP Core分为8个子模块:uC接口模块、时钟分频模块、发送数据FIFO模块、接收数据FIFO模块、状态机模块、发送数据逻辑模块、接收数据逻辑模块以及中断形式模块。
深入分析SPI的四种传输协议可以发现,根据一种协议,只要对串行同步时钟进行转换,就能得到其余的三种协议。为了简化设计规定,如果要连续传输多个数据,在两个数据传输之间插入一个串行时钟的空闲等待,这样状态机只需两种状态(空闲和工作)就能正确工作。

使用特权

评论回复
7
hjh2008| | 2008-9-21 17:17 | 只看该作者

严重支持TYW!

“其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。”

这句话不是很明白能否解释一下?

还有SPI的速度可达多少?

使用特权

评论回复
8
wuming1106|  楼主 | 2008-9-21 17:53 | 只看该作者

SPI的问题

谢谢楼上的高手们,我用的是合泰MCU,TYW,我想请问你下袄,那传感器的时序图我也发了,请教下,他上面的时序是低电平有效吧?而且是用了3线的,就是读写都用一根线的,比如给传感器初始化,肯定先发送地址,那发送地址的时候只管发送,不需要管接受的~3线的用法是不是更简单啊?而且接受的时候是不是也是低电平有效??

使用特权

评论回复
9
tyw| | 2008-9-21 19:07 | 只看该作者

仔细啃协议吧


FlashFlex51 MCU 单主多从的SPI →    http://ww1.microchip.com/downloads/en/AppNotes/00966A_cn.pdf
 

 

 

 

 

 

 

 

 

 

 

使用特权

评论回复
10
wuming1106|  楼主 | 2008-9-21 19:22 | 只看该作者

...

我用的MCU不自带spi的,所以要自己给时序,那应该 咋办??

使用特权

评论回复
11
tyw| | 2008-9-21 21:11 | 只看该作者

93c46 演示程序

93c46 演示程序 
93c46是1k位串行EEPROM储存器。 每一个储存器都可以通过DI/DO引脚写入或读出。它的存储容量为1024位,内部为128×8位或64×16位。93C46为串行三线SPI操作芯片,在时钟时序的同步下接收数据口的指令。指令码为9位十进制码,具有7个指令,读、擦写使能、擦除、写、全擦、全写及擦除禁止。该芯片擦写时间快,有擦写使能保护,可靠性高,擦写次数可达100万次,以下给出了93C46与单片机的接线图,和引脚说明。 


  

说明: 93c46的第6脚org为16/8位模式选择, XL2000套件第6脚接地,仅工作在8位模式下。 




XL2000的93C46部分原理图 

 
接线方法: 
1用一个4PIN数据排线一端插入CPU部分JP53(P3口)的P3.4,P3.5,P3.6,P3.7。另外一端插入93C46部分的输入端JP46. 
2用一条8PIN的数据排线把CPU部份的P2口(JP52)接到八路指示灯部份的JP32。 
此程序先把8路跑马灯的数据写入93C46, 然后读出送P2口显示。 运行程序可以观察到8路跑马灯。 
为证明93C46的作用, 可以拔下93c46的数据线, 再次运行程序, 则没有跑马灯。  

93C46的跑马灯运行照片 
 READ EQU 0 ;读93C46
WRITE EQU 2 ;写入93C46
EWEN EQU 4 ; 93C46写入使能
EWDS EQU 6 ; 93C46写入禁止
CS BIT P3.7 ; 93C46 CS
CLK BIT P3.6 ; 93C46 CLK
DI BIT P3.5 ; 93C46 DI
DO BIT P3.4 ; 93C46 DO
ADR46 EQU 20H
ORG 00H
START0: MOV 21H,#00H ; 取地址码
MOV 22H,#08H ; 8组8个码
MOV P3,#10H
MOV ADR46,#00H ;93C46地址00H
START: MOV A,#EWEN ;写入使能
CALL TO9346
MOV A ,21H ;载入取码指针
MOV DPTR,#TABLE ;至TABLE取码
MOVC A,@A+DPTR
MOV R4,A ;存入"写入寄存器"
MOV A,#WRITE ;写入数据
CALL TO9346
MOV A,#EWDS ;写禁止
CALL TO9346
INC 21H ;取下一个码
INC ADR46 ;下一个地址
CALL DELAY1
DJNZ 22H,START
MOV R0,#30H ;存入8051的RAM 地址
MOV ADR46,#00H ;93C46 :00地址
MOV 22H,#08H ; 93C46 8个地址8个码
A1: MOV A,#READ ;读(地址)的数据
CALL TO9346
MOV A,R4 ;93C46输出的数据载入ACC
MOV @R0,A
INC ADR46 ;读下一个地址
INC R0 ;下一个RAM
DJNZ 22H,A1
A2: MOV 22H,#08H
MOV R0,#30H
OUTPUT:MOV A,@R0
MOV P2,A ;输出至P2
CALL DELAY1 ;
INC R0
DJNZ 22H,OUTPUT
JMP A2
TO9346: SETB CS ;93C46 CS=1
SETB DI ;DI=1
SETB CLK ;CLK=1
CALL DELAY ;启动位
CLR CLK ;CLK=0
CALL DELAY
MOV DPTR,#JPTBL46
JMP @A+DPTR ;依ACC值跳至相关地址
JPTBL46: AJMP SREAD ;读
AJMP SWRITE ;写
AJMP SEWEN ;写使能
AJMP SEWDS ;写禁止
SREAD:
MOV A,#80H ;送操作码10
CALL SDATA
MOV A,ADR46 ;载入93C46地址
CALL SADR ;写入7位地址(DI)
CALL RDT46 ;读出数据(DO),存入3CH
MOV R4,A
;CALL RDT46 ;读出数据(DO),存入3DH
;MOV 3DH,A
JMP EX9346
SWRITE:
MOV A,#40H ;送操作码01
CALL SDATA
MOV A,ADR46 ;载入93C46地址
CALL SADR ;写入7位地址
MOV A,R4 ;写入(3CH)数据
CALL SDT46
;MOV A,3DH ;写入(3DH)数据
;CALL SDT46
JMP EX9346
SEWEN:
CLR A ;送操作码00
CALL SDATA
MOV A,#60H ;写使能操作码11XXXXX
CALL SADR
JMP EX9346
SEWDS:
CLR A ;送操作码00
CALL SDATA
CLR A ;写7位禁止操作码000XXXX
CALL SADR
EX9346: CLR CS ;CS=0
RET
SADR:
CLR C
RLC A
MOV R3,#7
JMP SD1
SDATA:
MOV R3,#2
JMP SD1
SDT46: MOV R3,#8 ;写入8位数据
SD1: RLC A ;
MOV DI,C
SETB CLK
CALL DELAY
CLR CLK
CALL DELAY
DJNZ R3,SD1
RET
RDT46: MOV R3,#8 ;读出8位数据
RD1: SETB CLK
CALL DELAY
CLR CLK
CALL DELAY
MOV C,DO
RLC A
DJNZ R3,RD1
RET
DELAY: MOV R7,#0FH
DJNZ R7,$
RET
DELAY1: MOV R4,#20
D1: MOV R5,#20
D2: MOV R6,#248
DJNZ R6,$
DJNZ R5,D2
DJNZ R4,D1
RET
TABLE : DB 0FEH ,0FDH ,0FBH, 0F7H ;广告一个灯左移
DB 0EFH ,0DFH ,0BFH, 7FH ;
END

使用特权

评论回复
12
wuming1106|  楼主 | 2008-9-21 21:49 | 只看该作者

xiexie

很感谢,我自己再仔细研究~

使用特权

评论回复
13
wuming1106|  楼主 | 2008-9-21 22:18 | 只看该作者

顶~~~

我怀疑是我延时不够,只打了2个NOP明天在去试试~我觉得我那个程序就是看了51程序改变的,刚刚也看了那PIC的差不多,他打脉冲的时候用了个延时程序,所以明天我也去试试~

使用特权

评论回复
14
cyber211| | 2009-6-20 21:11 | 只看该作者
Great!Wanderful

使用特权

评论回复
15
mxh0506| | 2009-6-21 10:08 | 只看该作者
好资料,谢谢了!

使用特权

评论回复
16
gfs0521| | 2009-6-25 09:13 | 只看该作者
学习了
标注一下,呵呵

使用特权

评论回复
17
wdwd321| | 2013-4-12 15:05 | 只看该作者
学习了

使用特权

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

本版积分规则

15

主题

58

帖子

1

粉丝