📄 lab-08-2013.s43
字号:
//******************************************************************************
// MSP430F20xx Demo - I2C Master Receiver, single byte
//
// Description: I2C Master communicates with I2C Slave using
// the USI. Slave data should increment from 0x00 with each transmitted byte
// which is verified by the Master.
// LED off for address or data Ack; LED on for address or data NAck.
// ACLK = n/a, MCLK = SMCLK = Calibrated 1MHz
//
// ***THIS IS THE MASTER CODE***
//
// Slave Master
// (msp430x20x3_usi_09.c)
// MSP430F20x2/3 MSP430F20x2/3
// ----------------- -----------------
// /|\| XIN|- /|\| XIN|-
// | | | | | |
// --|RST XOUT|- --|RST XOUT|-
// | | | |
// LED <-|P1.0 | | |
// | | | P1.0|-> LED
// | SDA/P1.7|------->|P1.6/SDA |
// | SCL/P1.6|<-------|P1.7/SCL |
//
// Note: internal pull-ups are used in this example for SDA & SCL
//
// Z. Albus
// Texas Instruments Inc.
// May 2006
// Built with IAR Embedded Workbench Version: 3.41A
//******************************************************************************
#include "msp430x20x3.h"
ORG 250
SLV_Data DW 0
ORG 260
SLV_Addr DW 0
ORG 270
I2C_State DW 0
;-----------------------------------------------------------------------------
ORG 0F800h ;
;-----------------------------------------------------------------------------
RESET MOV.W #0280h,SP ; 初始化堆栈
StopWDT MOV.W #WDTPW+WDTHOLD,&WDTCTL ; 关看门狗
;-------------------------------------------------------------------------------
setDCO MOV.B &CALBC1_8MHZ,&BCSCTL1 ; 设置DCO 8MHZ
MOV.B &CALDCO_8MHZ,&DCOCTL
;-------------------------------------------------------------------------------
setIO MOV.B #0XC0,&P1OUT ; 设置P1.6、P1.7
BIS.B #0XC0,&P1REN ; 接内部上拉电阻
MOV.B #0XFF,&P1DIR ; 输出方向
CLR.B &P2OUT ; 输出
MOV.B #0XFF,&P2DIR ; 输出方向
;-------------------------------------------------------------------------------
setI2C MOV.B #0XC1,&USICTL0 ; 置P1.6、P1.7 I2C模式
MOV.B #0X70,&USICTL1 ; 使能I2C 模式 ,开中断
MOV.B #0X2,&USICKCTL ; 设置时钟极性
BIS.B #0X20,&USICNT ;
BIC.B #0X1,&USICTL0 ; 使能 USI
BIC.B #0X1,&USICTL1 ; 清标志位
EINT
;-------------------------------------------------------------------------------
mainloop BIS.W #0X10,SR ; 进入低功耗 LPM0
NOP
JMP mainloop ; 循环
;-------------------------------------------------------------------------------
USI_TRX:
;-------------------------------------------------------------------------------
PUSH.W R14 ;
BIT.B #0X2,&USICTL1 ; 发送数据开始 ?
JNC state ;
BIS.B #0X1,&P1OUT ; LED 亮
MOV.W #0X2,&I2C_State ; 发送数据
state ADD.W &I2C_State,PC ;
JMP State_0 ;
JMP State_2 ;
JMP State_4 ;
JMP State_6 ;
JMP State_8 ;
JMP State_10 ;
JMP State_12 ;
State_0 JMP HOME ;
State_2 MOV.B &USICNT,R14 ; 8位 数据 RX 地址
AND.B #0XE0,R14 ;
AND.B #0X8,R14 ;
MOV.B R14,&USICNT ;
BIC.B #0X2,&USICTL1 ; 清开始标志
MOV.W #0X4,&I2C_State ; 检查地址
JMP HOME ;
State_4 BIT.B #0X1,&USISRL ;
JNC A1 ;
INC.B &SLV_Addr ;
A1 BIS.B #0X2,&USICTL0 ; SDA 输出
CMP.B &SLV_Addr,&USISRL ; 地址匹配 ?
JNE receive ;
CLR.B &USISRL ; 发送正确命令
BIC.B #0X1,&P1OUT ;
MOV.W #0X8,&I2C_State ;
JMP A2 ;
receive MOV.B #0XFF,&USISRL ; 发送错误命令
BIS.B #0X1,&P1OUT ;
MOV.W #0X6,&I2C_State ;
A2 BIS.B #0X1,&USICNT ;
JMP HOME ;
State_6 BIC.B #0X2,&USICTL0 ; SDA 输入
MOV.B #0X90,&SLV_Addr ; 复位从机地址
CLR.W &I2C_State ;
JMP HOME ;
State_8 BIS.B #0X2,&USICTL0 ;
MOV.B &SLV_Addr,&USISRL ;
BIS.B #0X8,&USICNT ;
MOV.W #0XA,&I2C_State ; 发送数据
JMP HOME ;
State_10 BIC.B #0X2,&USICTL0 ; SDA 输入
BIS.B #0X1,&USICNT ; 接收命令
MOV.W #0XC,&I2C_State ;
JMP HOME ;
State_12 BIT.B #0X1,&USISRL ; 检查地址
JNC A3 ;
BIC.B #0X1,&P1OUT ;
JMP A4 ;
A3 BIC.B #0X1,&P1OUT ;
A4 INC.B &SLV_Data ; 如果收到命令
BIC.B #0X2,&USICTL0 ;
MOV.B #0X90,&SLV_Addr ; 复位从机地址
CLR.W &I2C_State ; 状态复位
HOME BIC.B #0x1,&USICTL1 ; 清标志位
pop.w R14 ;
RETI ;
;------------------------------------------------------------------------------
; 中断向量
;------------------------------------------------------------------------------
ORG 0FFFEh ; MSP430 复位向量
DW RESET ;
ORG USI_VECTOR ; USICNT 中断向量
DW USI_TRX ;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -