This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F2013:以 Digitalpoti 和 PCFXXXX 器件为例、使用软件 UART 和硬件 I2C USI 将 RS232转换为 I2C 总线

Guru**** 2394295 points
Other Parts Discussed in Thread: MSP430F2013

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/651282/msp430f2013-using-software-uart-and-hardware-i2c-usi-to-convert-rs232-to-i2c-bus-as-an-example-with-digitalpoti-and-pcfxxxx-device

主题中讨论的其他器件:MSP430F2013

在这里、我发现了许多问题、以便进行从 PC (RS232)到 I2C 总线器件的通信。

我已经编写了一个汇编程序、以便通过 MSP430F2013实现此目的(其他器件可以使用具有内部 I2C USI 的器件)

我在 ME EWMS 工作站中将此作为控制器来执行此操作:)

下面是一个有用的代码:

;--copyright--,Ewms.scidata.EU
; Copyright (c) 2017, S-C-I data GBR
;版权所有。
;
Keyfield 控制器

;版本 V4_5
;带有外部控制器的 EWMS III 到 COM PC 的软件版本
;添加双向通信命令
; RX/TX 作为前通道上的中断 LED 作为 Scannmarix
;前通道 FG2<->PC<->FrontpChannel
的 Atuomatic 刷新;版本 V4_4
; EWMS 到 COM PC 的第一个软件版本与外部控制器
; v4.4
;处理器更改为 F2013
;v4.3:
;添加位置命令[s]设置位置值
; +--recive set Digitalpoti 2 Byte
; +--Decode smXvv to [5X][M0][v]
; +--Send 3 Byte to I2C Bus
; ——即 s5040FF“Set All Wactipper”
;——版权所有
—————————————————————————————————————————
; MSP430G2231 EWMS - RS232到 I2C 主发送器,双字节
;*RS232
命令:
; [sig:S5、s4、s3、s2、s1、s0)
;[@40xx]=发送[xx]至 CN 5偶数(引脚:11、9、7、5、3、 1)地址:$40
; [
@:D1、D3、D5、D7、D9、D11);[ 42xx]=发送[xx]至 CN 7偶数(引脚:17、15、13、11、9、7)地址:42美元
; [SIG:d0、d2、d4、d6、d8、d10)
;[@44xx]=将[xx]发送到 CN 7 ODD (引脚:18、16、14、12、10、8)地址:44美元
;[@
@50xx]=发送[xx]到 CN 7 Poti (引脚:2、3)[批量]地址:50美元;[发送[5个]引脚:[CN 至 CN 7 Pin ](VDD)[5xx) 地址:54美元
;字节格式15位[P][S][B5][a][dd][a][dd][a][a][cc][a][P][P]= Stopbit [S]=Starbit [B5]=CS 字节
; [a] aknear[dd] Databyte [cc]=校验和
;数据格式|+|n|n|n|n|n|n|n|n|n|n|n||n|n|n|n|n|n|n|
; |||||| ||||+-++-+-+->LSB 数据字节
; |+-+-+-+-+-+---- > HSB 数据字节
; ------------------------------------------------------- >符号(+)=0 (-)=1
;
字节格式23位[P][S][B5][a][dd][a][dd][a][dd][a][a][dd][a][a][cc][a][P][P]= Stopbit [S]=Starbit
; [B5]=CS Byte [a] aknear[dd] Databyte [cc]=校验和
;数据格式|+|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|
; |||||| |||||| |||||| |+-+-+-+-+-+-->LSB 数据字节
; |||||| ||||+-++-++-+-+---- > MSB 数据字节
; |+-+-+-+-+-+---- > HSB 数据字节
; ------------------------------------------------------- >签名(+)=0 (-)=1
;

;***这是主代码***
;
按钮主控
;
; MSP430G2013
; --------
; /|\| XIN|-
; || |;
-|RST XOUT|-
; |:RS232_Bus (Soft):|
;9600 8N1 RS232到 PC | |;
<---- |P1.1/TXD |;
---- |P1.5/RXD P1.0|->LED
; |:I2C_Bus (UART):::|
; <---- |P1.7/SDA |;
<---- |P1.6/SCL |
;
;注:在这个示例中,SDA & SCL 使用内部上拉
电阻;使用 IAR 嵌入式工作平台构建
;--- 9600波特率硬件/软件 UART 的定义,MCLK = 1MHz --------

BiTime_5 EQU 0032 ; 0.5位长度-位
间隔时间的一半 equ 0064 ;104us-位
LF 之间的时间 equ 0Ah ; ASCII 换行
CR equ 0Dh ;ASCII 回车

;*********
;通过 I2C 传输 PCF8574 Devicw 代码(每步20个时钟)最大 f (400kHz/20)=20kHz *
PCF_CN5 equ 040h ;PCF8574控制代码= 0100,地址= 000w
;$40= CN5 $42= CN7 gerade $44= CN7 ungerade
;CN5 40美元
;位| 7|6|5|4|3|2|1|0|
;引脚|LED||11 | 9 | 7 | 5 | 3 | 1 |
PCF_CN7o equ 042h ;PCF8574控制代码= 0100,地址= 001w
;CN7 ODD 为42美元
;位| 7|6|5|4|3|2|1|0|
;引脚|LED||17 |15 |13 |11 | 9 | 7 |
PCF_CN7e equ 044h ;PCF8574控制代码= 0100,地址= 001w
;即使是 CN7,也要44美元
;位| 7|6|5|4|3|2|1|0|
;引脚|LED||18 |16 |14 |12 |10 |8 |
;*************
#include 

;----------------------------------------------
;端口定义
;-----
#define RS232TX 位5 /* RS232 Tx P1.5 (3)*/
#define RS232RX BIT1 /* RS232 Rx P1.1 (4)*/
#define SCL_RJ BIT6、&P1DIR /* SCL_RJ P1.6 (8)*/
#define SDA_RJ BIT7、&P1DIR /* SDA_RJ P1.7 (9)*/
#define I2C_IFG P1IFG /* I2C 中断挂起 P1.n */
#define I2C_IES P1IES /* I2C 中断边缘 SEL P1.n */
#define I2C_IE P1IE /* I2C 中断启用 P1.n */
#define SCL_IFG BIT6、&P1IFG /* SCL 中断挂起 P1.n */
#define SDA_IFG BIT7、&P1IFG /* SDA 中断挂起 P1.n */
#define SDA BIT6 /* SDA_Pin P1.6 (8)*/
#define SCL BIT7 /* SCL_Pin P1.7 (9)*/

#define P1DEF 00100001b /* P1.x 方向定义*/
#define P2DEF 11000000b /* P2.x 方向定义*/

;---------------
;寄存器变量
;-----

#define I2CState R4
#define MST_DATA R5 /* I2C Transmiut 的第一个数据*/
#define slav_add R6
#define UARTRX R7
#define I2C_buff R8 /* I2C RxTx 缓冲器 */
#define DataConv R9. /* ASCII2HEX/HEX2ASCII 转换*/
#define RXData R10 /* ISR RS232 RX 缓冲器 */
#define TXData R11 /* ISR RS232 TX 缓冲器 */
#define Bitcnt R12 /* ISR RS232位计数器 */
#define SPTR R13. /*字符串 RS232发送 PTR */
#define MST_data2 R14 /* I2C Transmiut 的第二个数据*/
#define DCO_tr0 R14 /* DCO 的临时寄存器*/
#define DCO_TR1 R15 /*校准 */
#define JU跳_AD R15 /*存储接收字节 */
#define CRC_B R15. /*存储 CRC 字节 */
;--------------------------------------------------------
RSEG CSTACK ;定义堆栈段
;-----------------
RSEG 代码 ;汇编到闪存
甚至
;------------------------------------------------------------------------------------
复位 MOV.w #0280h、SP ;初始化 stackpointer
StopWDT MOV.w #WDTPW+WDTHOLD、&WDTCTL;停止看门狗定时器
CheckCal CMP.b #0xFF、&CALBC1_1MHz ;检查校准常数
JNE 负载 ;如果未擦除,则加载。
陷阱 JMP 陷阱 ;如果已擦除,则不加载,则陷阱 CPU!
负载 CLR.b DCOCTL (&D) ;选择最低 DCOx 和 MODx 设置
MOV.b &CALBC1_1MHZ,&BCSCTL1;将 DCO 设置为1MHZ (76800为8)
MOV.b &CALDCO_1MHz、&DCOCTL
设置 P1 MOV.b #P1DEF、&P1OUT ;P1.6和 P1.7作为上拉电阻
BIS.b #P1DEF、&P1REN ;P1.6和 P1.7作为上拉电阻
MOV.b #P1DEF、&P1DIR ;未使用的引脚作为输出
设置 P2 MOV.b #0x00、&P2OUT
MOV.b #P2DEF、&P2DIR
SetupUSI mov.b #USIPE6+USIPE7+USIMST+USISWRST、和 USICTL0;端口、I2C 主器件
MOV.b #USIIE+USII2C、&USICTL1;启用 I2C
MOV.b #USIDIV_3+USISSEL_2+USICKPL、和 USICKCTL;SMCLK/8
BIS.b #USIIFGCC、USICNT ;禁用自动清除控制
BIC.b #USISWRST、和 USICTL0 ;启用 USI
BIC.b #USIIFG、和 USICTL1 ;清除挂起标志
CLR.w I2CState
CLR.b MST_DATA

设置 TA MOV.w #tassel_2+MC_2、&TACTL;清除 TAR 并设置 TAR 源= SMCLK
SetupBC MOV.b #XT2OFF+DIVA1+RSEL2+RSEL0、&BCSCTL1;ACLK/4 RSEL=5
SetupC0 MOV.w #OUT、TACCTL0 ; TXD 空闲作为标记

SYSPRT 提示 ;常规中断使能
;-----
; PC 输入 rutiene
;-----------------
;初始 PCF8574 (地址40、42、44)
;清除所有 LED
MOV.b #040h、slav_add ;发送地址,R/W = 0
CLR.w I2CState ;重置状态机
MOV.b #0xFF、MST_DATA ;将 LED 设置为关闭
BIS.b #USIIFG、和 USICTL1
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
MOV.b #042h、slav_add ;发送地址,R/W = 0
CLR.w I2CState ;重置状态机
MOV.b #0xFF、MST_DATA ;将 LED 设置为关闭
BIS.b #USIIFG、和 USICTL1
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
MOV.b #044h、slav_add ;发送地址,R/W = 0
CLR.w I2CState ;重置状态机
MOV.b #0xFF、MST_DATA ;将 LED 设置为关闭
BIS.b #USIIFG、和 USICTL1
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断

;设置初始
MOV.b #040h、slav_add ;发送地址,R/W = 0
CLR.w I2CState ;重置状态机
MOV.b #0x7F、MST_DATA ;将 LED 设置为打开
BIS.b #USIIFG、和 USICTL1
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
MOV.w #String0、SPTR ; R11指针=到用户提示"r/w?
调用#TX_String ;发送字符串
MOV.b #042h、slav_add ;发送地址,R/W = 0
CLR.w I2CState ;重置状态机
MOV.b #0x7F、MST_DATA ;将 LED 设置为打开
BIS.b #USIIFG、和 USICTL1
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
;激活 RS232RX
CLR.b P1IFG ;清除所有中断标志
BIS.b #RS232RX、P1IES ;RS232空间上的中断
;将最后一个 LED 设置为就绪
MOV.b #044h、slav_add ;发送地址,R/W = 0
CLR.w I2CState ;重置状态机
MOV.b #0x7F、MST_DATA ;将 LED 设置为打开
BIS.b #USIIFG、和 USICTL1
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断




Mainloop push.w #Mainloop ;设置返回地址
CLR.b P1IFG
MOV.b #RS232RX、P1IE ;启用 RS232中断
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
NOP
和.b #007h、RXData ;高5位被剪切为"0"
RLA.w RXData ; MPY 乘以2表示 Jumpadress
Add.w RXData、PC ;跳转至命令功能
JMP I2C_WR ;[@];跳转至 I2C 写入
JMP RX_EXIT ;[q]; cle Input Command
JMP I2C_RD ;[r];跳转至 I2C 读取
JMP POTI_ADJ;[s];跳转至设置 Beendervalue
JMP BEND_SET;[t];跳转至加载状态寄存器
JMP DRE_ADJ ;[-];跳转至 FRAM 写保护
JMP Set_Vol ;[v];跳转至设定体积电位器(1)
JMP Set_PAR ;[w];跳转至设定锅位(2)


RX_COMPLETE BIC.b #RS232RX、P1IE ;禁用 RS232 [针脚]中断
MOV.w #RX_Count、BitCnt;设置 RX 编程器
MOV.w #CCIS0+OUTMOD0+CCIE、&CCTL0;RXD =标记=空闲
JMP TA0_ISR
;------------------------------------------------------
POTI_ADJ ;[s];向 I2C 总线(Poti) smXvv -> 5Xm0vv
写入3字节; 示例:s14FF -> 5410FF
;------------------------------------------------
;获取第一个字节
MOV.b #RS232RX、P1IE ;启用 RS232中断
CLR.b P1IFG
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
PUSH.b RXData
;获取第二个字节
MOV.b #RS232RX、P1IE ;启用 RS232中断
CLR.b P1IFG
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
MOV.b RXData、1 (SP)
;获取第3字节
MOV.b #RS232RX、P1IE ;启用 RS232中断
CLR.b P1IFG
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
PUSH.b RXData
;获取第4字节
MOV.b #RS232RX、P1IE ;启用 RS232中断
CLR.b P1IFG
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
MOV.b RXData、1 (SP)
调用#Conv_ASCI ;获取第一个数据
pop.w MST_data ;
swpb MST_data ;[vv00]->[00v]
MOV.w MST_DATA、MST_data2;复制到第二个数据
调用#Conv_ASCI ;获取地址
pop.w slav_add ;
swpb slav_add ;[mX00]->[00mX]
MOV.w slav_add、MST_data;复制到第一个数据到 [墨西哥]
和.b #0xF0、MST_DATA ;将(X)设备地址剪切至[M0]
和.b #0x0F、slav_add ;将(m) reg 地址剪切为[0x]
BIS.b #0x50、slav_add ;将 slavaddress (5)添加到[5X]
CLR.w I2CState ;重置状态机
BIS.b #USIIFG、和 USICTL1
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
MOV.w #String0、SPTR ; R11指针=到用户提示"r/w?
调用#TX_String ;发送字符串
NOP
RET
;------------------------------------------------
I2C_WR ;将2字节写入 I2C 总线
;-----------------
;获取第一个字节
MOV.b #RS232RX、P1IE ;启用 RS232中断
CLR.b P1IFG
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
PUSH.b RXData
;获取第二个字节
MOV.b #RS232RX、P1IE ;启用 RS232中断
CLR.b P1IFG
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
MOV.b RXData、1 (SP)
;获取第3字节
MOV.b #RS232RX、P1IE ;启用 RS232中断
CLR.b P1IFG
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
PUSH.b RXData
;获取第4字节
MOV.b #RS232RX、P1IE ;启用 RS232中断
CLR.b P1IFG
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用中断
MOV.b RXData、1 (SP)
调用#Conv_ASCI ;获取数据
pop.w MST_data
swpb MST_data
调用#Conv_ASCI ;获取地址
pop.w slav_add
swpb slav_add
CLR.w I2CState ;重置状态机
BIS.b #USIIFG,&USICTL1;准备 I2C 到 TX
BIS.w #LPM0+GIE、SR ;输入 LPM0,启用到 TXI2C 的中断
MOV.w #String0、SPTR ; R11指针=到用户提示“>&CR&LF
调用#TX_String ;发送字符串
NOP
RET
;------------------------------------------------
RX_EXIT ;[q];cle 输入命令
I2C_RD ;[r];跳转至 I2C 读取
Bend_set;[t];跳转至加载状态寄存器
DRE_ADJ ;[-];跳转至 FRAM 写保护
SET_Vol ;[v];跳转至设定体积电位器(1)
SET_PAR ;[w];跳转至设定锅位(2)
BR #reset
;----------------------------------------------------------
USI_ISR;
;---------------
ADD.w I2CState、PC ; I2C 状态机
JMP STATE0 ; Startbit 和 Device Address
JMP STATE2 ;接收 Nack/ACK 位
JMP 州4. ;检查 ACK? 和 Send Byte IF ACK
; 否则、发送停止并退出
JMP STATE6 ;接收数据确认/应答位
JMP STATE8. ;检查 ACK? 和 Send Byte IF ACK
; 否则、发送停止并退出
JMP STATE10. ;

STATE0 ;Startbit 生成和 Adress Send
BIS.b #0x01、&P1OUT ;LED 亮起:序列启动
CLR.b 和 USISRL ;生成起始条件
BIS.b #USIGE+USIOE,和 USICTL0;
BIC.b #USIGE,和 USICTL0 ;
MOV.b slav_add、USISRL ;发送地址,R/W = 0
MOV.b &USICNT、R8 ;位计数器= 8、Tx 地址
和.b #0xE0、R8
ADD.b #0x08、R8
MOV.b R8、USICNT
MOV.w #2、I2CState ;转至下一状态: Rx 地址(N)ACK
BIC.b #USIIFG、和 USICTL1
TI
STATE2 ; ; Rx 地址
BIC.b #USIOE、USICTL0 ;SDA =输入
BIS.b #0x01、USICNT ;位计数器= 1、Rx (N) ACK
MOV.w #4、I2CState ;进入下一状态,chk (N)ACK
BIC.b #USIIFG、和 USICTL1
TI
州4. ;进程地址(N)Ack,数据 Tx
BIS.b #USIOE、USICTL0 ;SDA =输出
bit.b #0x1、USISRL ;如果 NACK 被接收
JNC DATA_Tx ; ACK
CLR.b 和 USISRL
BIS.b #0x01、USICNT ;位计数器= 1、SCL 高电平、SDA 低电平
MOV.w #10、I2CState ;转到下一状态,生成停止
BIS.b #0x01、&P1OUT ;打开 LED:错误
BIC.b #USIIFG、和 USICTL1
TI
数据 Tx
MOV.b MST_DATA、USISRL
BIS.b #0x8、USICNT ;位计数器= 8、Rx 数据
MOV.w #6、I2CState ;下一状态:测试数据,(N)ACK
BIC.b #0x1、&P1OUT ;LED 熄灭
BIC.b #USIIFG、和 USICTL1
TI
STATE6 ;接收数据确认/应答位
BIC.b #USIOE、USICTL0 ;SDA =输入
BIS.b #0x01、USICNT ;位计数器= 1、接收(N) Ack 位
MOV.w #8、I2CState ;转至下一状态:检查(N)Ack
BIC.b #USIIFG、和 USICTL1
TI
STATE8 ;处理数据(N)Ack 位
BIS.b #USIOE、USICTL0
bit.b #0x01、USISRL ;如果 NACK 被接收
JZ 数据_采集
BIS.b #0x1、&P1OUT ; LED 亮起:错误; NACK
JMP STATE8_Exit
Data_Ack
BIC.b #0x1、&P1OUT ;LED 熄灭
bit.b #0x10、slav_add ;? :检查 Poti (1)还是 io (0)
JZ STATE8_Exit ;0:只有1字节发送[EXIT]
BIC.b #0x10、slav_add ;1:Clear 2 Bytecontroll
MOV.b MST_data2、USISRL;1:MOV 第二个数据传输到 I2C
BIS.b #0x8、USICNT ; 1:位计数器= 8、Rx 数据
MOV.w #6、I2CState ; 1:下一状态:测试数据,(N)ACK
bic.b #USIIFG,&USICTL1:和传输
TI


STATE8_Exit ;如果最后一个字节发送
CLR.b 和 USISRL
BIS.b #0x1、USICNT ;位计数器= 1、SCL 高电平、SDA 低电平
MOV.w #10、I2CState ;进入下一状态:生成停止
BIC.b #USIIFG、和 USICTL1
TI
STATE10.
MOV.b #0xFF、USISRL ;USISRL=1释放 SDA
BIS.b #USIGE、USICTL0 ;启用透明锁存器
BIC.b #USIGE+USIOE、和 USICTL0;锁存器/ SDA 输出被禁用
CLR.w I2CState ;为下一个 Tx 重置状态机
BIC.w #LPM0、0 (SP) ;退出激活以进行下一个传输
BIC.b #USIIFG、和 USICTL1
TI
;------------------------------------------------
;PC 输入 Rutiene
;0-9 =0x30-0x39 A-F =0x61-0x66 (a-f =0x41-0x46)
;|<-ASCII->|| |<-地址->|
0=0011 0000->0000 0000->0000
0000;1=0011 0001->0000 0001->0001 0000
;~
;9=0011 1001->0000 1001->1001 0000
;A=0110 0001->0000 1010-0000
;F=0110 011010->1111 0000--> 0000-->—
————————————————————————————————————————————————————————————————————————————————————
CONV_ASCI ;将2xASCII 转换为8位 HEX

调用#Conv_ASC ;将 ASCI 转换为 Hexnibble
swpb 2 (SP) ;交换高和低咬
调用#Conv_ASC ;将 ASCI 转换为 Hexnibble
调用#NIB_Shift ;跳转至 Adress Shift
RET

Conv_ASC ;将 ASCII 转换为十六进制并转换为地址
bit.b #01000000b、4 (SP) ;如果是 a-f 还是 A-F?
JZ NO_AF ;否:仅限较低的交谈
ADD.b #09h、4 (SP) ;是:更改 ASCII 代码->十六进制+6
No_AF 和.b #0Fh、4 (SP) ;并剪切较高的半字节
RET

NIB_Shift;交换高电平<->低半字节@ 2 (SP)
CLRC ;清除移位进位
RLC.b 5 (SP) ;第一遍-压入栈的值为
RLC.b 5 (SP) ;旋转以将上半字节移动到位
RLC.b 5 (SP) ;低半字节
RLC.b 5 (SP) ;
ADD.B 4 (SP)、5 (SP) ;并将高半字节存储到低半字节
CLR.b 4 (SP) ;擦除 Shift 的高字节
可重置 ;返回到主叫
方;-----------------
延迟 ;通信周期之间的延迟
;--------------------------------------------------------
MOV.w #0xFFFF、R7
DL1 Dec.w R7
Jnz DL1.
RET
;UART 子程序
;---- 在 PC 上显示 ASCII 字符串-------------------------------------------------------
字符串0 dB 0AAh;'>' ;">"
StringNL DB CR、LF、0 ;CR、LF、"NULL"
;DUMY dB 0FFh ;仅在奇数地址时使用
;--------------------------------------------
;SOFT_UART Rx&TX 例程
;------------------------------------------------
RX_Count DB RX_Edge-TA0_JAD ;为 RX 设置 Timer_A
dB RX_BIT-TA0_JAD ; RX 第一个数据位
dB RX_BIT-TA0_JAD ;第二个
dB RX_BIT-TA0_JAD ;第三
dB RX_BIT-TA0_JAD ;第四
dB RX_BIT-TA0_JAD ;第五
dB RX_BIT-TA0_JAD ;第六
dB RX_BIT-TA0_JAD ;第七
dB RX_Comp-TA0_JAD ;RX 完成,处理 RX 数据
TX_Count DB TX_BIT-TA0_JAD ; TX 第一个数据位
dB TX_BIT-TA0_JAD ;第二个
dB TX_BIT-TA0_JAD ;第三
dB TX_BIT-TA0_JAD ;第四
dB TX_BIT-TA0_JAD ;第五
dB TX_BIT-TA0_JAD ;第六
dB TX_BIT-TA0_JAD ;第七
dB TX_BIT-TA0_JAD ; TX 第八个(最后一个)数据位
dB TX_Mark-TA0_JAD ;TX 停止位=标记
TX_END dB TX_Comp-TA0_JAD ; TX 完成
甚至
;------------------------------------------------
;SOFT_UART TX 字符串
;------------------------------------------------
TX_String ;发送 ASCII 字符串,SPTR 用作指针
TX_S1 MOV.b @SPTR+、TXData ;以空字符终止=0
调用#TX_Byte ;
TST.b 0 (SPTR) ;
Jnz TX_S1 ;
可重置 ;;----

----------------------------------------------------------------
TX_BYyte;子例程从 TXData Buffer 发送字符
;-------------------------------------------------------
TX_1 BIC.b #BIT1、&P1OUT ;在*new* BIT0->Bit1上设置 TX
MOV.w &TAR、&CCR0 ; TA 计数器的当前状态
Add.w #Bitime、&CCR0 ;一段时间到第一位
BIS.w #0100h、TXData ;向 RXTXData 添加标记停止位
RLA.w TXData ;添加空间起始位
MOV #TX_Count、BitCnt ;将 TXData 字符发送到 RS232
MOV.w #CCIS0+OUTMOD0+CCIE、&CCTL0;TXD =标记=空闲
BIS.w #GIE、SR ;输入 LPM0,启用中断
TX_WAIT bit.w #CCIE、&CCTL0 ;等待 TX 完成
Jnz TX_WAIT ;
可重置 ;;----
----------------------------------------------------------------
TA0_ISR;RXTXData Buffer 保存 UART 数据
;---------------
MOV.w &TAR、&TACCR0 ; TA 计数器的当前状态
ADD.w #Bitime、TACCR0 ;为下一位添加偏移量
MOV.b @BitCnt+、JU跳_AD ;分支到中的下一个例程
ADD.w JU跳_AD、PC
TA0_JAD ;在
RX_Edge 上方设置 RX/TX_COUNT 表 TI ;
RX_BIT bit.b #RS232RX、&P1IN ;在接收锁存

RX_1B 中获取位等待 RRC.b RXData ;存储接收到的位
RX_CONT RETI
RX_Test Jnz RX_Next ;下一位?
;>>>>> 在此处解码接收到的字节<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
RX_Comp bit.b #RS232RX、&P1IN ;在接收锁存中获取位等待
RRC.b RXData ;存储接收的位
BIC.w #CCIE、&CCTL0 ;所有位 RXED、禁用中断
BIC.w #LPM0+GIE、0 (SP) ;设置为在 Mainloop 中激活
;>>>>>>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
RX_Next TI ;
;
TX_BIT ;TX 字节从此处开始
TX_Next RRA.w TXData ; LSB 被移位以进位
JC TX_Space ;JUMP -->位= 1
TX_Mark BIC.b #RS232TX、&P1OUT ; TX 标记
TI ;
TX_Space bis.b #RS232TX、&P1OUT ;TX 空间
TI ;
TX_Comp BIS.b #RS232TX、&P1OUT ;TX 空间
BIC.w #CCIE、&CCTL0 ;所有位 TX,禁用中断
BIC.w #LPM0+GIE、0 (SP) ;在 Mainloop 中设置为活动
TI ;; TX
结束
;;----
----------------------------------------------------------------
; 使用的中断矢量:MSP430G2xx1
;-------------------------------------------------------
常见的 INTVEC
org) RESET_VECTOR ;MSP430复位向量
DW 复位 ;
org) USI_Vector ;USICNT
DW USI_ISR ;
org) TIMERA0_VECTOR ;定时器 A0中断向量
DW TA0_ISR
org) Port1_vector ;Port1中断向量(RX)
DW RX_COMPLETE
结束

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Patrick:

    感谢您提供代码示例并向普通社区提供汇编服务。 我将此主题标记为已关闭、但可以随时回答通过此帖子可能出现的任何问题。

    此致、
    Ryan