简单翻译了下实验箱的C例程,TI处翻转P42测量信号,未复现少一个时钟问题,还是需要楼主的工程:
-
- ;---------------------------------------------------------------------*/
- ; --- STC MCU Limited ------------------------------------------------*/
- ; --- STC 1T Series MCU Demo Programme -------------------------------*/
- ; --- Mobile: (86)13922805190 ----------------------------------------*/
- ; --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
- ; --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
- ; --- Web: www.STCAI.com ---------------------------------------------*/
- ; --- BBS: www.STCAIMCU.com -----------------------------------------*/
- ; --- QQ: 800003751 -------------------------------------------------*/
- ; 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
- ;---------------------------------------------------------------------*/
-
- ;************* 功能说明 **************
-
- ;本例程基于STC32G为主控芯片的实验箱进行编写测试。
-
- ;使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
-
- ;edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
-
- ;USART1复用SPI与USART2复用SPI相互通信。
-
- ;通过P6口LED灯指示通信结果,P6=0x5a表示数据传输正确。
-
- ;下载时, 选择时钟 24MHz (用户可自行修改频率).
-
- ;******************************************/
- $include (STC32G.inc)
- ; 系统工作频率定义
- FOSC EQU 24000000 ;系统工作频率
-
-
-
- ; 位定义
- S1SS BIT P2.2
- S1MOSI BIT P2.3
- S1MISO BIT P2.4
- S1SCLK BIT P2.5
-
- S2SS BIT P2.2
- S2MOSI BIT P2.3
- S2MISO BIT P2.4
- S2SCLK BIT P2.5
-
- ; 中断向量表
- ORG 0000H
- LJMP MAIN ;复位向量
- ORG 0023H
- LJMP UART1_ISR ;UART1中断向量
- ORG 0051H
- LJMP UART2_ISR ;UART2中断向量
- ORG 0100H
-
- ; 数据定义
- rptr DATA 20H ;读指针
- wptr DATA 21H ;写指针
- over BIT 22H.0 ;传输完成标志
-
- ; 外部数据缓冲区
- buffer1 XDATA 0000H
- buffer2 XDATA 0100H
-
- ;/*************************************************
- ; 函数名: main (主函数)
- ; 功能: 主程序入口,实现SPI通信测试
- ; 参数: 无
- ; 返回: 无
- ; 说明: 初始化系统,配置SPI通信,测试数据传输
- ;*************************************************/
- MAIN:
- ; 系统初始化
- LCALL sys_init ;系统初始化
- LCALL usart1_spi_init ;USART1使能SPI主模式初始化
- LCALL usart2_spi_init ;USART2使能SPI从模式初始化
-
-
- ; 初始化缓冲区 (for i=0; i<128; i++)
- XRL WR6, WR6 ;i = 0
- INIT_LOOP:
- MOV R11, R7
- MOV WR4, WR6
- ADD WR4, #WORD0 buffer1
- MOV DPL, R5 ;设置DPTR
- MOV DPH, R4
- MOVX @DPTR, A ;buffer1[i] = i
-
- CLR A
- MOV WR4, WR6
- ADD WR4, #WORD0 buffer2
- MOV DPL, R5 ;设置DPTR
- MOV DPH, R4
- MOVX @DPTR, A ;buffer2[i] = 0
-
- INC WR6, #01H ;i++
- CMP WR6, #080H
- JSL INIT_LOOP
-
- SETB EA ;使能总中断
- ; 执行SPI通信测试
- LCALL test
-
- ; 主循环 (while(1))
- MAIN_LOOP:
- SJMP MAIN_LOOP
- ; FUNCTION _m (END)
-
- ;/*************************************************
- ; 函数名: uart1_isr (UART1中断服务程序)
- ; 功能: 处理UART1中断,发送SPI数据
- ; 参数: 无
- ; 返回: 无
- ; 说明: UART1中断处理函数,实现数据发送
- ;*************************************************/
- UART1_ISR:
-
- PUSH WR10
- PUSH WR6
- PUSH PSW1
- PUSH DPH
- PUSH DPL
-
- JNB TI,UART1_MAIN_HANDLER
- CPL P42
- CLR TI
-
- MOV R7,rptr
- CMP R7,#080H
-
- JNC UART1_SEND_DONE
-
- MOV R10,rptr
- MOV R11,R10
- INC A
- MOV rptr,R11
- MOVZ WR6,R10
- ADD WR6,#WORD0 buffer1
- MOV DPL,R7
- MOV DPH,R6
- MOVX A,@DPTR
- MOV SBUF,A
-
- SJMP UART1_MAIN_HANDLER
- UART1_SEND_DONE:
-
- SETB over
-
-
- UART1_MAIN_HANDLER:
-
- JNB RI,UART1_EXIT_HANDLER
-
- CLR RI
- CLR P21
- UART1_EXIT_HANDLER:
- POP DPL
- POP DPH
- POP PSW1
- POP WR6
- POP WR10
- RETI
- ; FUNCTION uart1_isr (END)
-
- ;/*************************************************
- ; 函数名: uart2_isr (UART2中断服务程序)
- ; 功能: 处理UART2中断,接收SPI数据
- ; 参数: 无
- ; 返回: 无
- ; 说明: UART2中断处理函数,实现数据接收
- ;*************************************************/
- UART2_ISR:
-
- PUSH WR10
- PUSH WR6
- PUSH PSW1
- PUSH DPH
- PUSH DPL
-
- JNB S2TI,UART2_S2TI_HANDLER
-
- CLR S2TI
-
- UART2_S2TI_HANDLER:
-
- JNB S2RI,UART2__EXIT_HANDLER
-
- CLR S2RI
-
- MOV R10,S2BUF
- MOV R7,wptr
- MOV R11,R7
- INC A
- MOV wptr,R11
- MOVZ WR6,R7
- ADD WR6,#WORD0 buffer2
- MOV DPL,R7
- MOV DPH,R6
- MOV @DR56,R10
-
- UART2__EXIT_HANDLER:
- POP DPL
- POP DPH
-
- POP PSW1
- POP WR6
- POP WR10
- RETI
- ; FUNCTION uart2_isr (END)
-
- ;/*************************************************
- ; 函数名: sys_init (系统初始化函数)
- ; 功能: 初始化系统时钟、端口模式等系统参数
- ; 参数: 无
- ; 返回: 无
- ; 说明: 设置WTST、EAXFR、CKCON,配置各端口模式
- ;*************************************************/
- sys_init:
- MOV WTST, #00H ;设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
- SETB EAXFR ;扩展寄存器(XFR)访问使能
- MOV CKCON, #00H ;提高访问XRAM速度
-
- ; 设置端口模式
- MOV P0M1, #030H ;设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
- MOV P0M0, #030H
- MOV P1M1, #032H ;设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
- MOV P1M0, #032H
- MOV P2M1, #03CH ;设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
- MOV P2M0, #03CH
- MOV P3M1, #050H ;设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
- MOV P3M0, #050H
- MOV P4M1, #00H ;设置P4准双向
- MOV P4M0, #00H
- MOV P5M1, #0CH ;设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
- MOV P5M0, #0CH
- MOV P6M1, #0FFH ;设置为漏极开路(实验箱加了上拉电阻到3.3V)
- MOV P6M0, #0FFH
- MOV P7M1, #00H ;设置为准双向口
- MOV P7M0, #00H
-
- SETB P20 ;P2.0置1
- RET
- ; FUNCTION sys_init (END)
-
- ;/*************************************************
- ; 函数名: usart1_spi_init (USART1 SPI主模式初始化函数)
- ; 功能: 配置USART1为SPI主模式,实现SPI通信
- ; 参数: 无
- ; 返回: 无
- ; 说明:
- ; - 设置SPI引脚映射:P2.2/S1SS, P2.3/S1MOSI, P2.4/S1MISO, P2.5/S1SCLK
- ; - 配置串口模式0,8位数据
- ; - SPI参数配置:
- ; * DORD=0 (MSB先行)
- ; * 主机模式 (Master mode)
- ; * CPOL=0, CPHA=0 (SPI模式0)
- ; * 速度=SYSCLK/16
- ; * 使能SPI功能
- ; - 使能UART1中断
- ;*************************************************/
- usart1_spi_init:
- ; 设置SPI引脚映射
- SETB S1SPI_S0 ;切换S1SPI到P2.2/S1SS,P2.3/S1MOSI,P2.4/S1MISO,P2.5/S1SCLK
- CLR S1SPI_S1
-
- ; 配置串口模式
- MOV SCON, #010H ;使能接收,必须设置为串口模式0
-
- ; 配置SPI参数
- MOV A, #010H ;USARTCR1 = 0x10, 使能USART1的SPI模式
- MOV WR6, #0FDC0H
- MOV WR4, #07EH
- MOV @DR4, R11
-
- MOV R11, @DR4 ;DORD=0 (数据顺序:MSB先行)
- ANL A, #0BFH
- MOV @DR4, R11
-
- MOV R11, @DR4 ;主机模式 (Master mode)
- ANL A, #0FBH
- MOV @DR4, R11
-
- MOV R3, @DR4 ;CPOL=0, CPHA=0 (SPI模式0)
- MOV @DR4, R3
-
- MOV A, #02H ;USARTCR4 = 0x02, SPI速度为SYSCLK/16
- MOV WR2, #0FDC3H
- MOV WR0, #07EH
- MOV @DR0, R11
-
- MOV R11, @DR4 ;使能SPI功能
- ORL A, #08H
- MOV @DR4, R11
-
- ; 使能中断
- SETB ES ;使能UART1中断
-
- RET
- ; FUNCTION usart1_spi_init (END)
-
- ;/*************************************************
- ; 函数名: usart2_spi_init (USART2 SPI从模式初始化函数)
- ; 功能: 配置USART2为SPI从模式,实现SPI通信
- ; 参数: 无
- ; 返回: 无
- ; 说明:
- ; - 设置SPI引脚映射:P2.2/S2SS, P2.3/S2MOSI, P2.4/S2MISO, P2.5/S2SCLK
- ; - 配置串口模式0,8位数据
- ; - SPI参数配置:
- ; * DORD=0 (MSB先行)
- ; * 从机模式 (Slave mode)
- ; * CPOL=0, CPHA=0 (SPI模式0)
- ; * 速度=SYSCLK/16 (由主机控制)
- ; * 使能SPI功能
- ; - 使能UART2中断
- ;*************************************************/
- usart2_spi_init:
- ; 设置SPI引脚映射
- SETB S2SPI_S0 ;切换S2SPI到P2.2/S2SS,P2.3/S2MOSI,P2.4/S2MISO,P2.5/S2SCLK
- CLR S2SPI_S1
-
- ; 配置串口模式
- MOV S2CON, #010H ;使能接收,必须设置为串口模式0
-
- ; 配置SPI参数
- MOV A, #010H ;USART2CR1 = 0x10, 使能USART2的SPI模式
- MOV WR6, #0FDC8H
- MOV WR4, #07EH
- MOV @DR4, R11
-
- MOV R11, @DR4 ;DORD=0 (数据顺序:MSB先行)
- ANL A, #0BFH
- MOV @DR4, R11
-
- MOV R11, @DR4 ;从机模式 (Slave mode)
- ORL A, #04H
- MOV @DR4, R11
-
- MOV R3, @DR4 ;CPOL=0, CPHA=0 (SPI模式0)
- MOV @DR4, R3
-
- MOV A, #02H ;USART2CR4 = 0x02, SPI速度为SYSCLK/16
- MOV WR2, #0FDCBH
- MOV WR0, #07EH
- MOV @DR0, R11
-
- MOV R11, @DR4 ;使能SPI功能
- ORL A, #08H
- MOV @DR4, R11
-
- ; 使能中断
- SETB ES2 ;使能UART2中断
-
- RET
- ; FUNCTION usart2_spi_init (END)
-
- ;/*************************************************
- ; 函数名: test (SPI通信测试函数)
- ; 功能: 执行SPI通信测试,验证数据传输正确性
- ; 参数: 无
- ; 返回: 无
- ; 说明: 发送数据并校验接收,控制LED指示结果
- ;*************************************************/
- test:
-
-
-
- CLR A
- MOV wptr, R11 ;wptr = 0
-
-
- CLR over ;over = 0
-
-
- CLR S1SS
-
- MOV A,#01H
- MOV rptr,R11
- MOV DPTR,#WORD0 buffer1
- MOVX A,@DPTR
- MOV SBUF,A
-
- TEST_WAIT_LOOP:
- JNB over,TEST_WAIT_LOOP
-
- SETB S1SS
-
- MOV R10,#05AH
- ;---- Variable 'ret' assigned to Register 'R10' ----
-
- XRL R7,R7
- ;---- Variable 'i' assigned to Register 'R7' ----
- TEST_CHECK_LOOP:
-
- ; 数据校验:比较buffer1[i]和buffer2[i]
- MOVZ WR4, R7
- ADD WR4, #WORD0 buffer2
- MOV DPL, R5 ;设置DPTR指向buffer2[i]
- MOV DPH, R4
- MOV R6, @DR56 ;读取buffer2[i]
-
- MOVZ WR4, R7
- ADD WR4, #WORD0 buffer1
- MOV DPL, R5 ;设置DPTR指向buffer1[i]
- MOV DPH, R4
- MOVX A, @DPTR ;读取buffer1[i]
- CMP R11, R6 ;比较数据
- JE TEST_DATA_MATCH
-
- MOV R10,#0FEH
-
- SJMP TEST_LOOP_END
-
- TEST_DATA_MATCH:
- INC R7,#01H
- CMP R7,#080H
- JC TEST_CHECK_LOOP
- TEST_LOOP_END:
-
- ; 检查测试结果
- CMP R10, #05AH ;ret == 0x5a?
- JNE NO_LED ;如果不等于,跳过点亮LED
- CLR P20 ;点亮LED指示成功
- NO_LED:
- RET
- ; FUNCTION test (END)
-
- END
复制代码
|