求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
CLRDI_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
[解决办法]
我有调试好的spi程序,需要的话可以联系我.tl_mail@126.com