鉴于很多单片机书上是多是使用C51实现的spi模式1,用于读取SD卡,实际上spi模式0应该更普遍才对。故这里附上汇编实现的spi代码,已在指纹模组上验证过,功能ok。
/*CopyRight@piaoxiang.zhang****/
CSn EQU P0.4
MOSI EQU P0.5
MISO EQU P0.6
CLK EQU P0.7
ORG 0000H
LJMP start
ORG 0100H
start:
LCALL spi_init
MOV R2,#40H
read_reg_all:
MOV40H,#0BFH;
LCALL spi_enable
MOV R0,#10H
MOV A,@R1
ADD A,R2
LCALL spi_write
LCALL spi_disable
DJNZ R2, read_reg_all
SJMP start
spi_read:
CPL CLK
NOP
NOP
MOV C,MISO
RLC A
CPL CLK
DJNZ R0,spi_read
RET
spi_write:
RLC A
MOV MOSI,C
CPL CLK;CLK为低,发送数据
NOP
NOP
NOP
CPL CLK;CLK 为高
DJNZ R0,spi_write
SETB MOSI
RET
spi_enable:
CLR CSn
;MOV R0,#01H
;LCALL delay
RET
spi_disable:
SETB CSn
;MOV R0,#01H
;LCALL delay
RET
spi_init:
CLR CLK ;CPOL=0,CLK 空闲低电平
SETB CSn ;片选低电平有效
SETB MOSI
SETB MISO
MOV R1,#40H
MOV 40H,#5FH
CLR P0.2;在取上拉电阻时
CLR P0.1;P01 与 P02 短路了
RET
仿真图