我将3485
芯片与149
单片机的相连,用modbus协议进行通讯,用异步
通信串口0来接受数据,程序里头用定时器中断来定时收完8个字节,之后进行数据处理(CRC之类的)
max3485初始化程序为:
bool Init_Max3485(void)
{
ME1 |= (UTXE0 + URXE0); // Enable USART0 TXD/RXD
UCTL0 = CHAR + SPB + SWRST; // 8位数据 两位停止位 无校验
UTCTL0 |= SSEL0;// UCLK = ACLK
URCTL0 |= 0x08; // sleep mode
UBR00 = 0x41;
UBR10 = 0x03; // 波特率设置为9600
// UMCTL0 = 0x00; // no modula
tion
UCTL0 &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0 + UTXIE0; // 使能接受和发送中断
IFG1&=~UTXIFG0;//使UTXIFG0复位
return true;
}
然后处理的程序为:串口中断为:
#pragma vector = UART0RX_VECTOR //串口0接收中断函数
__interrupt void Uart0Rx_Isr(void)
{
// CCR1 =TARA+5000; //CCR1中断允许
TACTL|=TACLR; //ACLK,清TAR
CCTL1 &=(~CCIFG);
CCTL1|=CCIE;
receBuf[receCount]= RXBUF0;
receCount++; //接收地址偏移寄存器加1
}
定时器A1中断处理
#pragma vector = TIMERA1_VECTOR //定时器A1中断函数
__interrupt void Timer_A1_Isr(void)
{
TACTL|=TACLR;
CCR1 =TAR+1000; //CCR1中断允许
if(receCount==8)
{
receTimeOut++;
if(receTimeOut>=1)
{
receTimeOut=1;
MAX3485_TRNS_ENA(); //将485置为发射状态
}
}
CCTL1 &=(~CCIE);
CCTL1 &=(~CCIFG);
// UART_ENTER_SLEEPA();
}
其他的程序太多感觉跟我遇到的问题关系不大,现在的问题就是,我用串口调试器通讯的时候总通讯不成功,总提示超时,波特率之类的设置应该也没问题,我从串口调试器读数据的时候 发送的是01 03 00 01 00 01 D5 CA , 这是8个字节,按道理说,我的单片机串口应该会进入8次中断,但是就是只进去一次中断,并且进去的这一次中断收到的数跟发送的数也对不上,
都困扰死我了,还望高手给予指教,谢谢了!
-
电路连接图
串口调试图
一周热门 更多>