3267|4

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求spi的汇编程序 [复制链接]

求spi的汇编程序。
我自己也写了一个 但是不知道不能写进去,还是读出来时有错误。用lcd显示结果总是错误的数据。
能看看这几个spi程序先??

;//FUNCTION: R5 READ_SPI( R4 )
;//***********************************************
;//DESCRIBE:读指令。
;//INPUT: 地址 R4
;//OUTPUT: 数据 R5
;//USING OTHER REG: R7
;//***********************************************
READ_SPI:
        ;MOV A,R4
        CLR CS_SPI
        CLR DI_SPI
        CLR CLK_SPI
        SETB DO_SPI
        SETB CS_SPI

        SETB DI_SPI  
        CALL PULSE_SPI         ;//送开始位1

        CALL PULSE_SPI        ;//        送操作位10
        CLR DI_SPI
        CALL PULSE_SPI        ;//

        CALL ADDRESS_SPI  ;//定位地址R4
        CALL GETDATA_SPI  ;//得到数据R5

        RET

;//FUNCTION: PULSE_SPI()
;//****************************************
;//DESCRIBE:在CLK_SPI引脚产生一个脉冲。前提是CLK_SPI为低电平
;//****************************************
PULSE_SPI:
        SETB CLK_SPI
        CLR CLK_SPI
        RET


;//FUNCTION: ADDRESS_SPI(R4)
;//***************************************
;//DESCRIBE: 根据地址R4(其中有7位才有效的) 在SPI定位
;//INPUT: R4
;//USING OTHER REG: R7
;//***************************************
ADDRESS_SPI:
        MOV A,R4
        MOV R7,#07H
        RLC A  ;//丢掉A7 即是第8位
SEND_ADDRESS_SPI:        ;//地址一位位发送出去
        RLC A
        MOV DI_SPI,C
        CALL PULSE_SPI
        DJNZ R7,SEND_ADDRESS_SPI
       
        RET

;//FUNCTION:  R5 GETDATA_SPI()
;//***************************************
;//DESCRIBE: 在DO_SPI引脚接收串行数据 保存到R5
;//OUTPUT: R5
;//USING OTHER REG: R7
;//***************************************
GETDATA_SPI:
        MOV R7,#08H
        CLR A
BIT_GETDATA_SPI:   ;//数据8bit一位位接收
        CALL PULSE_SPI
        MOV C,DO_SPI
        RLC A
        DJNZ R7,BIT_GETDATA_SPI

        CLR CS_SPI
        MOV R5,A
       
        RET

;//FUNCTION:  PUTDATA_SPI(R5)
;//***************************************
;//DESCRIBE: 在DO_SPI引脚发送串行数据R5
;//INPUT: R5
;//USING OTHER REG: R7
;//***************************************
PUTDATA_SPI:
        MOV R7,#08H
        MOV A,R5
BIT_PUTDATA_SPI:       ;//数据8bit一位位发送       
        RLC A
        MOV DI_SPI,C
        CALL PULSE_SPI
        DJNZ R7,BIT_PUTDATA_SPI

        CLR        DI_SPI
        CLR CS_SPI
        SETB CS_SPI
        JNB DO_SPI,$  ;//查询DO_SPI是否为 1 ,若是,送数据操作结束

        RET

;//FUNCTION:  EWEN_SPI()
;//***************************************
;//DESCRIBE: 写允许.
;//***************************************
EWEN_SPI:
        CLR CS_SPI
        CLR DI_SPI
        CLR CLK_SPI
        SETB CS_SPI

        SETB DI_SPI                ;//送开始位1
        CALL PULSE_SPI

        CLR DI_SPI                  ;//送操作码00
        CALL PULSE_SPI
        CALL PULSE_SPI

        MOV R4,#0FFH           ;//送地址11XXXXX
        CALL ADDRESS_SPI
       
        CLR CS_SPI
       
        RET
;//FUNCTION: WRITE_SPI(RI,R5)
;//****************************************
;//DESCRIBE: 把数据R5写到地址R4 An-A0的存储器上
;//INPUT: ADDRESS R4,DATA R5
;//****************************************
WRITE_SPI:
        CLR CS_SPI
        CLR DI_SPI
        CLR CLK_SPI
        SETB DO_SPI
        SETB CS_SPI

        SETB DI_SPI
        CALL PULSE_SPI         ;//开始位 1

        CLR DI_SPI                 ;//操作码 01
        CALL PULSE_SPI
        SETB DI_SPI
        CALL PULSE_SPI

        CALL ADDRESS_SPI  ;//定位R4 地址

        CALL PUTDATA_SPI  ;//送数据R5 进去

        CLR CS_SPI
       
        RET

最新回复

恩 我那个程序还是不行    !! 有谁知道的!  详情 回复 发表于 2007-7-19 00:07
点赞 关注

回复
举报

87

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
想问问,如何检测是否写进去了和读出来了
我用lcd显示读出来的数据都是错误的 应该全是0xff

是不是那些脉冲要延时一下啊?不够宽啊?

但是我写的这几个程序是仿照书本的程序来的哦  我就是生产脉冲pulse_spi 送地址address_spi 送数据和接收数据 putdata_spi  getdata_spi 这些程序独立出来 为了省rom 和比较好调用啊!

也发上主函数来吧 关于lcd的程序是没错的
MAIN:
        MOV SP,#2FH
        CALL INITIAL_LCD ;初始化lcd
        CALL EWEN_SPI    ;开写允许
;//++++++++++++++++++++++++++++++++++在lcd第一行显示原操作数  ‘这里是正确的’
        CALL ISBUSY_LCD ;lcd是否为忙 不忙才返回
        MOV R4,#80H
        CALL WRITECOMMAND_LCD ;//lcd写命令

        MOV R3,#09H
        MOV DPTR,#DATA_CODE
DISPLAY_LCD_MAIN:       
        CALL ISBUSY_LCD
        CLR A
        MOVC A,@A+DPTR
        MOV R5,A
        INC DPTR
        CALL WRITEDATA_LCD   ;//函数参数 R5为数据
        DJNZ R3,DISPLAY_LCD_MAIN
;//------------------------------------
;//++++++++++++++++++++++++++++++++++ 以0H为首地址写入
        MOV R6,#09H
        MOV DPTR,#DATA_CODE
        MOV R4,#0H
WRITESPI_MAIN:
        CLR A
        MOVC A,@A+DPTR
        ;ADD A,#1       ;//简单变数据存储
        MOV R5,A
        CALL WRITE_SPI  ;//函数参数 R4为地址 R5为数据
        INC DPTR
        INC R4
        DJNZ R6,WRITESPI_MAIN
;//------------------------------------
;//++++++++++++++++++++++++++++++++++ 读数据 放在以DATA_BUFFER为首的ram中
        MOV R6,#09H
        MOV R0,#DATA_BUFFER
        MOV R4,#0
READSPI_MAIN:
        CALL READ_SPI  ;//函数参数 R4为地址 R5为数据
        MOV A,R5
        MOV @R0,A
        INC R0
        INC R4
        DJNZ R6,READSPI_MAIN
;//------------------------------------
;//++++++++++++++++++++++++++++++++++在lcd第二行显示读出来的数据

        CALL ISBUSY_LCD
        MOV R4,#0C0H
        CALL WRITECOMMAND_LCD

        MOV R3,#09H
        MOV R0,#DATA_BUFFER

DISPLAY2_LCD_MAIN:       
        CALL ISBUSY_LCD
        MOV A,@R0
        MOV R5,A
        INC R0
        CALL WRITEDATA_LCD ;//函数参数 R5为数据
        DJNZ R3,DISPLAY2_LCD_MAIN
;//------------------------------------
        JMP $
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我有调试好的spi程序,需要的话可以联系我.tl_mail@126.com
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
网上有X5045的官方示例代码,《X5045 Application Note.pdf》《X25045 Application Note.pdf》
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
恩 我那个程序还是不行    !!

有谁知道的!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表