用于 MSP430 7.11.1 (7.11.1.983)的//IAR 汇编器
#include "msp430.h" ;#define controlled include 文件
命名 main ;模块名称
公共主函数 ;使主标签可以在 本模块外看到
RSEG CSTACK ;预先声明段
RSEG 代码 ;将程序放在“代码”段中
复位 MOV #SFE (CSTACK)、SP ;设置堆栈
StopWDT mov.w #WDTPW+WDTHOLD、WDTCTL ;停止看门狗计时器
//配置 SMCLK = 19.61MHz (3.3V)
主: bis.b #RSEL0、&BCSCTL1
BIS.b #RSEL1、&BCSCTL1
BIS.b #RSEL2、&BCSCTL1
BIS.b #RSEL3、&BCSCTL1 ;RSELx=15 (1111b)
BIS.b #DCO0、&DCOCTL
BIS.b #DCO1、&DCOCTL
BIS.b #DCO2、&DCOCTL ;DCOx=7 (111b)
BIC.b #MOD0、&DCOCTL
BIC.b #MOD1、&DCOCTL
BIC.b #MOD2、&DCOCTL
BIC.b #Mod3、&DCOCTL
BIC.b #Mod4、&DCOCTL ;MODx = 0 (00000b)
BIS.b #10h、&P1SEL ;P1.4 (引脚#6) = SMCLK
// P1.6 (引脚#22) = SCL
BIC.b #40h、 P1DIR (&P) ;输入
BIS.b #40h、 P1SEL (&P) ;I2C 引脚 SCL =使能
BIS.b #40h、 P1SEL2 (&P) ;I2C 引脚 SCL =使能
// P1.7 (引脚#23) = SDA
BIC.b #80h、 P1DIR (&P) ;输入
BIS.b #80h、 P1SEL (&P) ;I2C 引脚 SDA =使能
BIS.b #80h、 P1SEL2 (&P) ;I2C 引脚 SDA =使能
//将 USCI_B0配置为 I2C 模式
BIS.b #UCSWRST、 &UCB0CTL1 ;启用软件复位
BIS.b #UCMST、 UCB0CTL0 ; I2C 主机模式
BIS.b #UCMODE_3、&UCB0CTL0 ;eUSCI 模式= I2C
BIS.b #UCSYNC、 &UCB0CTL0 ;1=同步模式
BIC.b #UCSLA10、 &UCB0CTL0 ;寻址具有7位地址的从器件
BIS.b #UCSSEL_3+UCSWRST、和 UCB0CTL1 ;使用 SMCLK,保持软件复位
MOV.b #00200、 UCB0BR0 (&U) ;波特率= SMCLK/200
MOV.b #00000、 UCB0BR1 ;~100KHz
BIC.b #UCSWRST、 &UCB0CTL1 ;清除软件复位,恢复操作
//发送
MOV.w #0020h、 UCB0I2CSA ;I2C 从器件地址= AD7998-0 (AS =浮点)
BIS.b #UCTR、 &UCB0CTL1 ;UCTR=1 -> I2C=TX
BIS.B #UCTXSTT、 &UCB0CTL1 ;发送启动条件。
nnn: bit.B #UCB0TXIFG、&IFG2 ;UCB0TXIFG=1?
JNC nnn
MOV.b #04h、 UCB0TXBUF ;04h -> Tx
BIS.B #UCTXSTP、 &UCB0CTL1 ;发送停止条件
I2C_rdy 位。b #UCBBUSY、 &UCB0STAT ;等待 I2C 模块完成所有操作
JC i2c_rdy
JMP $ ;跳转至当前位置'$'
;(无限循环)
///----------------------------------
常见的 INTVEC ;中断矢量
///----------------------------------
org reset_vector ;重置向量
DW 复位
结束
运行:未传输任何数据。 只提供地址!!! 为什么?
分步运行-工作!!!
延迟运行:
//发送
MOV.w #0020h、 UCB0I2CSA ;I2C 从器件地址= AD7998-0 (AS =浮点)
BIS.b #UCTR、 &UCB0CTL1 ;UCTR=1 -> I2C=TX
BIS.B #UCTXSTT、 &UCB0CTL1 ;发送启动条件。
nnn: bit.B #UCB0TXIFG、&IFG2 ;UCB0TXIFG=1?
JNC nnn
等待 mov.w #01000、 R15. ;延迟至 R15
L1 Dec.w R15. ;减量 R15
Jnz L1 ;延迟?
MOV.b #04h、 UCB0TXBUF ;04h -> Tx
BIS.B #UCTXSTP、 &UCB0CTL1 ;发送停止条件
I2C_rdy 位。b #UCBBUSY、 &UCB0STAT ;等待 I2C 模块完成所有操作
JC i2c_rdy
JMP $
未传输任何数据。 只提供地址!!! 为什么?