你的位置: 首页 > 家电弱电 > 单片机

SPI总线的软件模拟

2016-12-21 17:36:25 | 人围观 | 评论:

 对于没有提供SPI接口的单片机而言,通常可使用软件的办法来模拟SPI的总线操作,包括串行时钟、数据输入和输出。

 Atmel公司生产的EEPROM具有SPI接口,存储容量为4KbAT25040就有SPI接口,80C51系列单片机与AT25040SPI总线接口接线如图所示。

SPI总线接口接线图<?XML:NAMESPACE PREFIX = O />

9-6中,P1.0模拟SPI的数据输出端(MOSI),P1.1模拟SPISCK输出端,P1.2模拟SPI的从机选择端(SS),P1.3模拟SPI的数据输入端(MISO)。下面给出模拟SPI串行输入、串行输出和串行输入/输出的3个子程序

1MCU串行输入子程序SPIIN

AT25040SO端接收8位数据并放入寄存器R0中。参考程序如下:

          SPIIN:               SETB         P1.1                    ;使P1.1(时钟)输出为1

                                CLR          P1.2                    ;选择从机

                                MOV          R1, #08H                ;置循环次数

          SPIIN1:               CLR          P1.1                    ;使P1.1(时钟)输出为0

                                NOP                                  ;延时

                                NOP

                                MOV         C, P1.3                  ;从机输出送进位C

                                RLC         A                        ;左移至累加器A

                                SETB        P1.1                     ;使P1.1(时钟)输出为1

                                DJNZ        R1, SPIIN1               ;判断是否循环8次(8位数据)

                                MOV         R0, A                    8位数据送R0

                                RET

2MCU串行输出子程序SPIOUT

80C51单片机中R0寄存器的内容传送到AT25040SI端。参考程序如下:

           SPIOUT:             SETB         P1.1                    ;使P1.1(时钟)输出为1

                                CLR          P1.2                    ;选择从机

                                MOV          R1, #08H                ;置循环次数

                                MOV          A, R0                   8位数据送累加器A

           SPIOUT1:             CLR          P1.1                    ;使P1.1(时钟)输出为0

                                NOP                                  ;延时

                                NOP

                                RLC         A                        ;左移至累加器A,最高为至C

                                MOV         P1.0, C                  ;进位C送从机输入

                                SETB         P1.1                    ;使P1.1(时钟)输出为1

                                DJNZ        R1, SPIOUT1              ;判断是否循环8次(8位数据)

                                RET

3MCU串行输入/输出子程序 SPIIO

80C51单片机R0寄存器的内容传送到AT25040SI端,同时从AT25040SO端接收8位数据。参考程序如下:

          SPIIO:                SETB         P1.1                    ;使P1.1 (时钟)输出为1

                                CLR         P1.2                    ;选择从机

                                MOV         R1, #08H                ;置循环次数

                                MOV         A, R0                   8位数据送累加器A

        SPIIO1:               CLR         P1.1                    ;使P1.1(时钟)输出为0

                                NOP                                 ;延时

                                NOP

                                MOV         C, P1.3                  ;从机输出送进位C

                                RLC         A                        ;左移至累加器A,最高为至C

                                MOV         P1.0, C                  ;进位C送从机输入

                                SETB        P1.1                     ;使P1.1(时钟)输出为1

                                DJNZ        R1, SPIIO1               ;判断是否循环8次(8位数据)

                                RET

  这些子程序适用于在串行时钟的上升沿输入和下降沿输出的各种串行外围接口芯片(如D/AA/D转换芯片、实时时钟芯片、LED显示驱动芯片等)。对于下降沿输入、上升沿输出的各种串行外围接口芯片,只要改变P1.1的输出电平顺序,这些子程序也同样适用。

  如先置P1.1为低电平,之后再次置P1.1为高电平,再置P1.1为低电平等等。





标签:

相关内容推荐: