bokee.net

电子/电气工程师博客

正文 更多文章

TMS320LF240X型DSP的SPI口与X5043的驱动程序

TMS320LF240XDSPSPI口与X5043的驱动程序

                 

王佰营    徐丽红

                                 wbymcs51.blog.bokee.net

       X5043SPI接口和TMS320LF240XDSPSPI接口兼容,无需用IO口通过软件模拟SPI时序,实现通讯非常方便。

                     一、两器件的SPI介绍

       A、TMS320LF240XDSPSPI接口

                            1、特点

1  四针通讯(SPISIMOSPISOMISPICLKSPISTE;

2  可选主机或从机模式;

3  独立的接收(SPIRXBUF)和发送(SPITXBUF)缓冲寄存器,发送和接收共用一个移位寄存器(SPIDAT)

4  SPI的时钟的相位和极性可配置;

5  发送和接收数据的位数(1---16)可设置;

                                                 2、 工作时应注意

1  在时钟脉冲的作用下,数据从移位寄存器(SPIDAT)的高位移出、低位移入,移出和移入是同时进行;

2  从机的收发时钟均由主机通过发送来启动时序电路而得到;

3  发送时数据要左对齐,接收时数据是右对齐;

B、X5043介绍

X5043512个字节,共分为4页,读写数据指令的位3作为地址A8,通过A8的高低电平,又将器件分为上半部分和下半部分;页地址从地址A8 A7A6A5A4A3A200开始到A8A7A6A5A4A3A211结束;A7-A2字节地址它与外界接口按三总线的串行接口协议。

读数据和写数据的工作方式完全不同,读数据的全部8位用来计数(A7A6A5A4A3A2 A1A0)0FFH溢出后变成00H;写数据时,只用最低两位计数,XXXXXX11B溢出后变成XXXX XX00B,所以连续写的实际结果是在4个单元中反复写入。

X5043数据在时钟上升沿在SI引脚上锁存,在时钟下降沿从SO引脚上输出的数据。X5043是一个半双工器件,接收和发送不能同时进行;而TMS320LF240XDSPSPI可实现双工,收发可同时进行,并且可控制发送,使发送脚在不用时高阻挂起而实现一个主机带动多个从机。DSPSPI最大传输率为DSP系统时钟的四分之一,而X5043的最高时钟速率为3.3MHz

由于接线简单,这里从略;其程序如下:

                     二、驱动程序

;==========================================================

;                       X5043  utility

;==========================================================

;==========================================================

;     X5043命令字常数定义

;==========================================================

WREN_INST    .set         0600h           ;允许写操作指令;

WRDI_INST     .set         0400h           ;禁止写操作指令;

WRSR_INST     .set         0100h           ;写状态寄存器指令;

RDSR_INST     .set         0500h           ;读状态寄存器指令;

WRITE_H         .set         0A00h          ;写数据指令,A8=1;

WRITE_L          .set         0200h           ;写数据指令,A8=0;

READ_H           .set         0B00h          ;读数据指令,A8=1;

READ_L           .set         0300h           ;读数据指令,A8=0;

SHFT_N            .set         16-8

 

;                          ldp         #DP_B01

                           .bss        SPI_data,                   1

                           .bss        SPI_addr,                   1

;==========================================================

;     ;宏定义部分

;==========================================================

SPI_CS_H  .macro                                                   

                    ldp         #PCDATDIR>>7

                    lacl         PCDATDIR

                    or           #20h

                    sacl         PCDATDIR                      ;cs_|-

                    .endm

 

SPI_CS_L   .macro                                                   

                    ldp         #PCDATDIR>>7

                    lacl        PCDATDIR

                    and        #0ffdfh

                    sacl        PCDATDIR                      ;cs-\_

                    .endm

;==============================================================

;     function:       x43_writ_st                ;写状态字程序

;     input:            SPI_data

;     output:          ---

;     usege:           acc

;==============================================================

x43_writ_st:       ;写状态字程序

                    SPI_CS_L                                       ;cs-\_

 

                    ldp         #SPIDAT>>7                  

                    splk       #WRSR_INST,   SPIDAT              ;发写状态寄存器指令

         

                    call        SPI_wait_wrd

                    

                    ldp         #DP_B01

                    lacc        SPI_data,     SHFT_N

                    ldp         #SPIDAT>>7

                    sacl        SPIDAT                                   ;写数据给状态寄存器

 

                    call         SPI_wait_wrd

 

                    SPI_CS_H                                      ;cs_|-     

         

                    call         x43_wait_wr                                                                                                 

                    ret

 

;==============================================================

;     function:       x43_read_st               ;读状态字程序

;     input:            ---

;     output:          SPI_data

;     usege:           acc

;==============================================================

x43_read_st:      ;读状态字程序

                    SPI_CS_L                                       ;cs-\_

 

                    ldp         #SPIDAT>>7                  

                    splk       #RDSR_INST,   SPIDAT              ;发读状态寄存器指令

         

                    call        SPI_wait_wrd

 

                    splk       #00h,            SPIDAT          ;产生从状态寄存器读数据时序

                    call        SPI_wait_wrd

                    and        #0ffh

 

                    ldp         #DP_B01

                    sacl        SPI_data

 

                    SPI_CS_H                                      ;cs_|-

 

                    ret

 

;==============================================================

;     function:       x43_write                   ;写数据程序

;     input:            SPI_data---要写入X5043的数据;

;                          ar1         ---目标地址:A8

;                          SPI_addr---目标地址:A7---A0

;     output:          SPI_data

;     usege:           acc,ar1

;==============================================================

x43_write:          ;写数据程序

                    SPI_CS_L                                       ;cs-\_

 

                    ldp         #SPIDAT>>7                                              

                    splk       #WREN_INST,  SPIDAT              ;发写使能指令

 

                    call       SPI_wait_wrd

 

                    SPI_CS_H                                      ;cs_|-

                    nop

                    SPI_CS_L                                       ;cs-\_

 

 

                    ldp         #SPIDAT>>7

                    mar        ar1

                    banz       wh_addr,*                                      

                    splk       #WRITE_L, SPIDAT              ;发写数据指令,A8=0

                    b            swjmp

wh_addr:     splk        #WRITE_H,       SPIDAT              ;发写数据指令,A8=1

swjmp:                                    

                    call        SPI_wait_wrd

         

                    ldp         #DP_B01

                    lacc       SPI_addr,     SHFT_N

 

                    ldp         #SPIDAT>>7

                    sacl        SPIDAT                                   ;写入X5043要存放的地址

 

                    call         SPI_wait_wrd

                    

                    ldp         #DP_B01

                    lacc        SPI_data,     SHFT_N

 

                    ldp         #SPIDAT>>7

                    sacl        SPIDAT                                   ;写入X5043要存放的数据

 

                    call         SPI_wait_wrd

 

                    SPI_CS_H                                      ;cs_|-

 

                    call         x43_wait_wr

                    ret

 

;==============================================================

;     function:       x43_read                    ;读数据程序

;     input:            ar1                ---源地址:A8

;                          SPI_addr      ---源地址:A7---A0

;     output:          SPI_data

;     usege:           acc,ar1

;==============================================================

x43_read:           ;读数据程序

                    SPI_CS_L                                       ;cs-\_

 

                    ldp         #SPIDAT>>7

                    ldp         #SPIDAT>>7

                    mar        ar1

                    banz       rh_addr,*                                       

                    splk       #READ_L,  SPIDAT              ;发读数据指令,A8=0

                    b            srjmp

rh_addr:      splk        #READ_H,  SPIDAT              ;发读数据指令,A8=1

srjmp:                                                          

                    call         SPI_wait_wrd

                    lacl         SPIRXBUF

 

                    ldp         #DP_B01

                    lacc        SPI_addr,     SHFT_N

 

                    ldp         #SPIDAT>>7

                    sacl        SPIDAT                                   ;写入要读取数据的地址;

 

                    call         SPI_wait_wrd

                    lacl         SPIRXBUF

 

                    splk        #00,              SPIDAT              ;产生读数据时钟;

 

                    call         SPI_wait_wrd

                    lacl         SPIRXBUF

 

                    and        #0ffh

                    ldp         #DP_B01

                    sacl       SPI_data

 

                    SPI_CS_H                                      ;cs_|-

                    ret

 

;==============================================================

;     function:       SPI_wait_wrd            ;SPI读写时序完成等待兼清中断标志

;     input:            ---

;     output:          acc

;     usege:           acc

;==============================================================

SPI_wait_wrd:   ;SPI读写时序完成等待兼清中断标志

swait:           ldp         #SPISTS>>7

                    bit          SPISTS,              BIT6

                    bcnd      swait,            NTC

 

                    lacl         SPIRXBUF

                    ret

 

;==============================================================

;     function:       x43_wait_wr              ;x5043写完成等待

;     input:            ---

;     output:          ---

;     usege:           acc

;==============================================================

x43_wait_wr:     ;x5043写完成等待

xwait:          call          x43_read_st

                    ldp         #DP_B01

                    bit          SPI_data,            BIT0

                    bcnd      xwait,           TC

 

                    ret

 

                                    三、 X5043驱动程序调用示例

;----------------------------------------------------------

;     function:       my_start              JOG处理程序

;     input:            ---

;     output:          ---

;     usege:           ---

;----------------------------------------------------------

my_jog:       ;JOG键处理程序

                    lar          ar1,               #01h         ;A8                

                    ldp         #DP_B01

                    splk       #05h,            SPI_addr   ;A7---A0

                    call         x43_read

                    ldp         #DP_B01

                    lacl         SPI_data

                    sacl        sd_buf   

                    call         send_pc                         ;发给PC机显示从X5043读出的数

                    ret

;----------------------------------------------------------

;     function:       my_start              PRESET键处理程序

;     input:            ---

;     output:          ---

;     usege:           ---

;----------------------------------------------------------

my_preset:   ;PRESET键处理程序

                    lar          ar1,                #01h        ;A8               

                    ldp         #DP_B01

                    splk        #05h,            SPI_addr ;A7---A0

                    splk        #‘H’,            SPI_data  ;要向X5043写的数据

 

                    call         x43_write

                    ret

                                           四、SPI初始化部分

  

    附 SPI初始化程序:( wbymcs51.blog.bokee.net)

 

;==============================================================

;     function:              SPI_INIT                   ;SPI初始化程序

;     input:            ---

;     output:          ---

;     usege:           ---

;==============================================================

SPI_INIT       ;SPI初始化程序

;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

;-- <6> --Serial Peripheral Interface (SPI) Registers

;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

;==========================================================

;     SPI----初始化

;==========================================================

;SPI模块中有9个寄存器用于控制该模块的操作:

;1SPICCR     SPI配置控制寄存器。

;2SPICTL      SPI操作控制寄存器。

;3SPISTS      SPI状态寄存器。

;4SPIBRR     SPI波特率寄存器。

;5SPIRXEMUSPI仿真缓冲寄存器。

;6SPIRXBUFSPI串行输入缓冲寄存器。

;7SPITXBUFSPI串行发送缓冲寄存器。

;8SPIDAT     SPI串行数据寄存器。

;9SPIPRI       SPI中断优先级寄存器。 

;----------------------------------------------------------

;SPICCR---串行外设接口配置控制寄存器----7040H

; D7   SPI SW RESETSPI软件复位位。用户在改变配置前,应把该位清0

;    并在复位操作前把该位置1.

;    O    初始化串行外设接口操作标志位至复位条件;

;    1    串行外设接口准备发送或接收下一个字符。

; D6   CLOCK  POLARITY。移位时钟极性位,该位控制SPICILK信号的极性。

;    见下表:

;  0  SPICLK信号的上升沿输出数据,在下降沿输入数据。当无数

;    据发送时,SPICLK保持低电平

;  1      SPICLK信号的下降沿输出数据,在上升沿输人数据。

;    当无数据发送时,SPICLK保持高电平。

; D5~D4  保留位。

;    SPI CHAR3 SPI CHAR2 SPI CHAR1  SPI CHAR0      字符长度

;       0                 0                0                0         1

;       0                 0                0                1         2

;       0                 0                1                0         3

;       0                 0                1                1         4

;       0                 1                0                0         5

;       0                 1                0                1         6

;       0                 1                1                0         7

;       0                 1                1                1         8

;       1                 0                0                0         9

;       1                 0                0                1         10

;       1                 0                1                0         11

;       1                 0                1                1         12

;       1                 1                0                0         13

;       1                 1                0                1         14

;       1                 1                1                0         15

;       1                 1                1                1         16

; D3~D0  SPI CHAR3-SPI CHAR0。数据长度选择位,具体如上表。

;----------------------------------------------------------

; D15--D8 D7 D6 D5 D4 D3 D2 D1 D0

;----------------------------------------------------------

;  0--0   0  1   0  0  0  1  1  1

;----------------------------------------------------------

                    ldp         #SPICCR>>7

                    splk       #47h,            SPICCR

 

;----------------------------------------------------------

;SPICTL---串行外设接口操作控制寄存器----7041H

; D7~D5  保留位。

; D4   OVERRUN INT ENA。超时中断使能位。

;    0  禁止超时中断

;    1  使能超时中断

; D3   CLOCK  PHASESPI时钟相位选择位。

;    0  正常的SPI时钟方式。

;    1  延迟半个周期的SPICLK信号

; D2   MASTER/SLAVESPI主从工作方式选择位。

;    0  从方式模式

;    1  主工作方式

; D1   TALK /从工作方式下发送允许位

;    0  禁止发送

;    .  在从工作方式下:若以前没有被配置成一般的I/O功能,则引脚

;      SPISOMI将置成高阻态

;      在主工作方式下:若以前没有被配置成一般的I/O功能,则引脚

;      SPISOMO将置成高阻态

;    1  允许发送

; D0   SPI INT ENA. SPI中断使能位。

;    0  禁止中断

;    1  允许中断

;----------------------------------------------------------

; D15--D8 D7 D6 D5 D4 D3 D2 D1 D0

;----------------------------------------------------------

; 0----0  0  0  0  0  0  1  1  0

;----------------------------------------------------------

                    ;ldp         #SPICTL>>7

                    splk       #06h,            SPICTL

 

;----------------------------------------------------------

; SPISTS---串行外设接口状态寄存器----7042H

; D7   RECEIVER OVERRUN FLAGSPI接收过冲标志位,该位为只读只清除

;    标志位。在前一个数据从缓冲器中读出之前又完成了下一个数据的接收或

;    发送操作,则SPI硬件将设置该位。该位表明最后一个接收到的数据已经

;    被覆盖写入,并因此而丢失。如果OVERRUN INT ENA位已被置1,则

;    该位每次置位时,SPI就发生一次中断请求。

;     该位可由以下3种操作来清除:

;            1): l到该位;

;            2): 0SPI SW RESET;

;            3): 系统复位。

;    OVERRUN INT ENA位被置位,则SPI将在第一次RECEIVER OVER

;    RUN FLAG置位时产生一次中断请求。如果在该标志位仍置位时又发生

;    了接收过冲事件,则SPI将不会再次申请中断请求。这就使得在每次发生

;    接收过冲事件后,必须向SPI SW RESET位写0来清除该标志位,使下一

;    次发生接收过冲事件时,又能产生过冲中断请求。换句话说,如果

;    RECEIVER o-VERRUN FLAG标志位由中断服务子程序保留设置(未被

;    清除),则当中断服务子程序退出时,将不会立即产生另一个过冲中断。

;    无论如何,在中断服务子程序期间应清除RECEIVER OVERRUN FLAG

;    标志位。因为RECEIV-ER OVERRUN FLAG标志位和SPI INT FLAG

;    志位共用相同的中断向量。在接收下一个数据时这将减少关于中断源的任

;    何可能疑问。

;    0 无中断请求

;    1 中断请求

; D6   SPI INT FLAGSPI中断标志位。

;       0    无中断请求

;        1    有中断请求。

; D5   TX BUF FULL FLAGSPI发送缓冲器满标志位。当向SPITXBUF寄存器

;       写入数据时,将置位该位。当SPITXBUF寄存器中的数据移人到SPIDAT

;    寄存器中后,将自动清除该位。

;       0    发送缓冲器空;

;        1    发送缓冲器中有数据。

; D4~D0  保留位。

;----------------------------------------------------------

; D7 D6 D5 D4 D3 D2 D1 D0

;----------------------------------------------------------

;

;----------------------------------------------------------

                    ;ldp         #SPISTS>>7

                    splk        #00h,            SPISTS

;----------------------------------------------------------

; SPIBRR ---串行外设接口波特率设置寄存器----7044H

; D7   保留位。

;  D6~D0  SPI BIT RATE6sPI BIT RATE0SPI波特率设置位。

;SPIBRR=3-127:

;     SPI波特率=Fout/(SPIBRR+1);

;     SPIBRR=(Fout/SPI波特率)-1

;SPIBRR=0/1/2:

;     SPI波特率=Fout/4;

;----------------------------------------------------------

; D7 D6 D5 D4 D3 D2 D1 D0

;----------------------------------------------------------

; 0  0  0  1  1  0  1  0

;----------------------------------------------------------

                    ;ldp         #SPIBRR>>7

                    splk        #39,            SPIBRR

;SPIBRR=(Fout/SPI波特率)-1=40MHz/1MHz - 1=39

 

;----------------------------------------------------------

; SPIPRI ---串行外设接口中断优先级控制寄存器----704FH

; D7   保留位

; D6   SPI PRIORITYSPI中断优先级选择位。

;    0 高优先级中断请求

;    1 低优先级中断请求

; D5~D4  SPI SUSP SOFT,SPI SUSP FREESPI仿真挂起时的操作控制位。

;    00 一旦仿真挂起,立即停止。

;    01 一旦仿真挂起;在当前的接收或发送完成后才停止。

;    10 SPI操作与仿真挂起无关。

;    11 SPI操作与仿真挂起无关。

; D3~D0  保留位

;----------------------------------------------------------

; D7 D6 D5 D4 D3 D2 D1 D0

;----------------------------------------------------------

; 0  0  1  1  0  0  0  0

;----------------------------------------------------------

                    ;ldp         #SPIPRI>>7

                    splk       #30h,            SPIPRI

 

;----------------------------------------------------------

; SPICCR--D7   SPI SW RESETSPI软件复位位。用户在改变配置前,

;应把该位清0 并在复位操作前把该位置1.

;    O    初始化串行外设接口操作标志位至复位条件;

;    1    串行外设接口准备发送或接收下一个字符。

;----------------------------------------------------------

; D15--D8 D7 D6 D5 D4 D3 D2 D1 D0

;----------------------------------------------------------

;  0--0   1  0   0  0  0  1  1  1

;----------------------------------------------------------

                    ;ldp         #SPICCR>>7

                    splk       #0C7h,         SPICCR

ret

 

分享到:

上一篇:单端自激式(RCC)反激开关电源的简

下一篇:常用元件(系列)设计速查表之九---

评论 (1条) 发表评论

  • 任国华 (游客) : 怎么还是汇编时代啊????

    2009-07-11 11:28

发表评论
验证码