这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » TO,zsmbj TO zsmbj 程序在这....

共2条 1/1 1 跳转至

TO,zsmbj TO zsmbj 程序在这....

院士
2006-09-17 18:14:16     打赏
TO,zsmbj TO zsmbj 程序在这....



关键词: zsmbj     程序     在这    

院士
2006-12-22 22:43:00     打赏
2楼
问     .org   $0000
     rjmp  START        
    .DEF   TEMP1 = R16
    .DEF   TEMP2 = R17
    .DEF   TEMP3 = R18
    .DEF   SPI_DATA = R21    
    .EQU   SPI_SCK = PINB7
    .EQU   SPI_MISO = PINB6
    .EQU   SPI_MOSI = PINB5
    .EQU   SPI_NSS = PINB4
        
        .ORG   $0080         
         rjmp  SPI_HANDLE
        
        .ORG   $0100

SPI_HANDLE:         
         in    SPI_DATA,SPDR
         reti

  START:        
    ldi    TEMP1,0x5f
    ldi    TEMP2,0x02
    out    spl,TEMP1
    out    sph,TEMP2 ;设置堆栈
    sei ;开全局中断
    ldi    TEMP1,0xbb
    ldi    TEMP2,0xff
    ldi    TEMP3,0xDf
    out    DDRB,TEMP1
    out    DDRC,TEMP2  ;PB口方向设为1011 1011,MISO设为输入,其他为输出
    out    SPCR,TEMP3  ;0101 1100 ,设为主机模式,方式3,fcl/4    
        ldi    TEMP3,0x00  ;用来接受数据的寄存器
        sbi    PORTB,SPI_NSS   
        rcall  delay
        rjmp   step1 ;先写9个字节数据    
  STEP0: ;读9个字节数据
    CBI    PORTB,SPI_NSS ;片选
    ldi    SPI_DATA,0x54   ;装入读命令字和地址
    rcall  WRITE
    ldi    SPI_DATA,0x00
    rcall  WRITE
    ldi    SPI_DATA,0x00
    rcall  WRITE
    ldi    SPI_DATA,0x00
       rcall  WRITE
       ldi    SPI_DATA,0x00
       rcall  WRITE
       ldi    SPI_DATA,0x00
       rcall  WRITE
       IN     SPI_DATA,SPDR
    MOV    R0,SPI_DATA  ;取出data~1
    rcall  WRITe
    IN     SPI_DATA,SPDR
    MOV    R1,SPI_DATA
    RCALL  WRITE
    IN     SPI_DATA,SPDR
    MOV    R2,SPI_DATA
    RCALL  WRITE
    IN     SPI_DATA,SPDR
    MOV    R3,SPI_DATA
    RCALL  WRITE
    IN     SPI_DATA,SPDR
    MOV    R4,SPI_DATA
    RCALL  WRITE
    IN     SPI_DATA,SPDR
    MOV    R5,SPI_DATA
    RCALL  WRITE
    IN     SPI_DATA,SPDR
    MOV    R6,SPI_DATA
    RCALL  WRITE
    IN     SPI_DATA,SPDR
    MOV    R7,SPI_DATA
    RCALL  WRITE
    IN     SPI_DATA,SPDR ;DATA~9
    MOV    R8,SPI_DATA
    sbi   portb,SPI_NSS
    RCALL  DELAY
    RET
  STEP1:    ;写9个字节数据
    cbi   PORTB,SPI_NSS  ;cs变低        
        ldi    SPI_DATA,0x84  ;装入写命令字和地址
    rcall  WRITE
    ldi    SPI_DATA,0x00
    rcall  WRITE
    ldi    SPI_DATA,0x00
    rcall  WRITE
    ldi    SPI_DATA,0x00
    rcall  WRITE
    ;mov    SPI_DATA,TEMP2
    ;rcall  WRITE
    MOV    SPI_DATA,R8
    RCALL  WRITE
    MOV    SPI_DATA,R7
    RCALL  WRITE
    MOV    SPI_DATA,R6
    RCALL  WRITE
    MOV    SPI_DATA,R5
    RCALL  WRITE
    MOV    SPI_DATA,R4
    RCALL  WRITE
    MOV    SPI_DATA,R3
    RCALL  WRITE
    MOV    SPI_DATA,R2
    RCALL  WRITE
    MOV    SPI_DATA,R1
    RCALL  WRITE
    MOV    SPI_DATA,R0 ;注:R8~R0,是9个准备好的数据
    RCALL  WRITE
    sbi    PORTB,4   ;cs变高
    rcall  delay
    RCALL  STEP0
  LOOP: rjmp   LOOP
  WRITE:
        out    spdr,SPI_DATA  ;将待传数据送入SPDR,启动SCK。
        rcall  delay
        ret
  delay:ldi  r31,0x20
    del:dec r31
        brne  del
    ret        
      ;DATAFLASH是AT45DB081B
      
                          1: 先注意,SPI的中断地址是0x0008,不会是你贴错了吧! 2: 编写程序时要注意时序:发送采用了1/128时钟,发送一个字节需要128×8个时钟周期。而在实际发送时却只延迟了32×3个周期就发送下一个字节了,这显然不对了。...
3: 多谢zsmbj先生... ....

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]