您好,
我在使用正确的设置和正确的时钟设置/偏差配置eUSCI时遇到一些问题。 首先我认为硬件还可以。 有一些巴士参与者在爱特梅尔处理器上进行了热转,也有一些人购买了处理器。 在RS485 IC和MSP430之间,本示波器显示有效数据(模拟示波器,而不是数据记录器)。 因此,我认为我只会在正确的软件设置下失败。 ;-)
我正在使用IAR嵌入式工作平台IDE 6.50。5。
我尝试重新混合一些代码示例: https://github.com/j-windsor/MSP430-DMX512/blob/master/main.c
您的示例中的一个:msp430fr243x_euscia0_UART_01.c www.ti.com/.../slac700
我的实际尝试之一:
//#include "io430/h"
#include "msp430fr2532.h"
#define chan_1 BIT4 //端口1 //输出1
#define chan_2 BIT1 //端口1 //输出2
#define chan_3 BIT5 //端口1 //输出3
#define chan_4 BIT2 //端口1 //输出4
#定义RX 位5 //port2 //RX UART
#define TX BIT6. //port2 //TX UART
#define de BIT7. //port2 //传输启用UART
#define re BIT1. //PORT3 //_receive enable UART (反向)
//DMX512/RS485设置
无符号int actChannel =0; //实际接收字节的变量
unsigned char busAddress =0; //DMX地址+1
无符号字符rxData =0; //received byte//unsigned
char byteReceived的值=0; //字节尚未收到?
INT MAIN ( VOID ){//
停止看门狗计时器以防止超时复位
WDTCTL = WDTPW + WDTHOLD;
P1SEL0 = 0x00;
P1SEL1 = 0x00;
P1DIR = CHAN_1 + CHAN_2 + CHAN_3 + CHAN_4;//通道1和通道3工作
P1OUT = 0x00;//CHAN_1 + CHAN_2 + CHAN_3 + CHAN_4;
P2SEL0 = RX;
P2SEL1 = RX;
P2DIR = DE;//和~RX
P2OUT = 0x00;
P3SEL0 = 0x00;
P3SEL1 = 0x00;
P3DIR = RE;
P3OUT = 0x00;
PM5CTL0 &=~(LOCKLPM2);
//设置振荡器:
__bis_sr_register (SCG0); //禁用FLL
CSCTL3 |= SELREF_REFCLK; //将REFO设置为FLL参考源
CSCTL0 = 0; //清除DCO和MOD寄存器
CSCTL1 &=~(DCORSEL_7); //清除DCO频率选择位优先
CSCTL1 |= DCORSEL_3; // SET DCO = 8MHz
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
__DELAY周期(3);
__BIC_SR_REGISTER (SCG0); //启用FLL
While (CSCTL7和(FLLUNLOCK0 | FLLUNLOCK1));//轮询直到FLL被锁定
CSCTL4 = SELMS__DCOCLKDIV |拉美经济体系__REFOCLK;//将默认的REFO (~3.2768万Hz)设置为ACLK源,ACLK =3.2768万Hz
//默认DCODIV为MCLK和SMCLK源
UCA1CTL1 || UCSWRST;//暂停用于初始
化UCA1CTL1 |= UCSSEL1;//小时钟,无错误检测,无奇偶校验
UCA1CTL0 = UCSPB | UCMODE_1;//两个低停止位
//UCA1CTLW0 =
UCA1BR0 = 32;//250kBBIE = UCA1RID= 8.000 250.000
~UCA1UCA0 = UCA1CA0;UCA1BIE = UCA1BIE = UCA1BIE =
//接收时中断
_BIS_SR (GIE);//中断启用
而(1)
{
IF (UCA1STATW和UCBRK)
{
actChannel =0;//重置通道计数
器}
/*P1OUT = CHAN_1 + CHAN_2 + CHAN_3 + CHAN_4;
用于(int i=0;i< 3万;i++);
P1OUT = 0x00;
for(int I=0;i< 3万;i++);*/
}
#if
defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)
#pragma vector=UISR_A1_vector
__interrupt void USI_A1_Elif defined(__GSCI_systems_)
#lif definedu_void
error_usiver_
#endif
{
SWITCH(__EIN_RANGE(UCA1IV,USI_UART_UCTXCPTIFG)){
案例0x02://接收
rxData = UCA1RXBUF;
//byteReceived = 1;
IF (actChannel == 2){
IF (rxData > 127)
{
P1OUT |=通道1;
}
否则
{
P1OUT ==~chan_1;
}
}
actChannel++;//递增通道
Break;
default:break;
}
UCA1IFG &=~UCTXIFG;//clear flag
}
我对eUSCI的所有设置有点困惑。 在系列/用户指南的第575页上,有一些校正/调制模式。 我只是想我可以将时钟设置为8MHz,然后将它设置为250 kBaud。 如果 您需要的偏差大于或小于16,数据表会在第576页上有所不同。 slac700中的示例仅适用于9600波特,需要所有校正,对吗?
如果有人给我提供更多信息或提示,我会非常高兴! :)我希望我粘贴所有重要信息。
Carsten,您好