主题中讨论的其他器件: MSP430F5528
你好!
我使用 MSP-TS430PZ100E (MSP450FR6047)和 SN5176B 差动收发器通过 RS485/USB 转换器与 PC 进行通信。
我以前从未使用过 SN5176B。 更准确地说、我没有将 UART 用于 RS485接口的经验。 使用 UART 的唯一成功经验是通过 TDS7200EVEM ( MSP430F5528)与 TTL 通信。
我必须使用 UCA2 (P5.0 - TXD、P5.1 - RXD、P5.2 - RE/DE)、因为 UCA0和 UCA1要么已经用于 JTAG、要么离试验电路板太远。 原理图如下所示;
在如下修改后、我使用了 TI 的"msp430fr60x7_euscia0_UART_01.c"示例代码;
#include
int main (空)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗
//配置 GPIO
P5SEL0 &=~(BIT0 | BIT1);
P5SEL1 |= BIT0 | BIT1; // USCI_A0 UART 操作
P5DIR |= BIT2;// P5.2 -> DE、~RE、输出
P5OUT &=~ BIT2; //
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
//最大 DCO 设置~8MHz 的启动时钟系统
CSCTL0_H = CSKKEY_H; //解锁 CS 寄存器
CSCTL1 = DCOFSEL_3 | DCORSEL; //将 DCO 设置为8MHz
CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;
CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1; //设置所有分频器
CSCTL0_H = 0; //锁定 CS 寄存器
//将 USCI_A0配置为 UART 模式
UCA2CTLW0 = UCSWRST; //将 eUSCI 置于复位状态
UCA2CTLW0 |= UCSSEL_SMCLK; // CLK = SMCLK
//波特率计算
// 800000000 /(16*9600)= 52.083
//分数部分= 0.083
//用户指南表24-4:UCBRSx = 0x04
// UCBRFx = int ((52.083-52)*16)= 1.
UCA2BRW = 52; // 8000000/16/9600
UCA2MCTLW |= UCOS16 | UCBRF_1 | 0x4900;
UCA2CTLW0 &=~UCSWRST; //初始化 eUSCI
UCA2IE |= UCRXIE; //启用 USCI_A0 RX 中断
_bis_SR_register (LPM3_bits + GIE); //输入 LPM3、中断被启用
__no_operation(); //用于调试器
}
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=EUSCI_A2_vector
_interrupt void USCI_A2_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(EUSCI_A2_vector)) USCI_A2_ISR (void)
其他
错误编译器不受支持!
#endif
{
switch (__evo_in_range (UCA2IV、USCI_UART_UCTXCPTIFG))
{
USCI_NONE 案例:中断;
USCI_UART_UCRXIFG 案例:
while (!(UCA2IFG&UCTXIFG));
UCA2TXBUF = UCA2RXBUF;
__no_operation();
中断;
案例 USCI_UART_UCTXIFG:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:中断;
默认值:break;
}
}
如下所示、我通过使用示波器持续发送一个字符来检查 TXD 端口是否提供输出、并确认它提供输出。
while (1)
{
// if (i>0)
{
一----;
P1OUT ^=(BIT0|BIT1); //切换 LED
_DELAY_CYCLES (100000);
_DELAY_CYCLES (100000);
_DELAY_CYCLES (100000);
_DELAY_CYCLES (100000);
_DELAY_CYCLES (100000);
_DELAY_CYCLES (100000);
_DELAY_CYCLES (100000);
_DELAY_CYCLES (100000);
_DELAY_CYCLES (100000);
}
if (bButton_menu)
{
显示("按下按钮菜单");
}
其他
{
show ("MaxiFlo 热量计");
}
UCA2TXBUF ='A';
UCA2TXBUF ="b";
// _ bis_SR_register (LPM4_bits | GIE);//输入 LPM4并带有中断
__no_operation(); //用于调试器
}
请帮我!!!

