打印

用MSP430F5438做模拟串口

[复制链接]
1782|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Neverweak|  楼主 | 2018-4-16 15:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dirtwillfly| | 2018-4-16 21:00 | 只看该作者
已在另一个帖子回复

使用特权

评论回复
板凳
51xlf| | 2018-4-18 11:55 | 只看该作者
发板没有定串口 定时器的功能

使用特权

评论回复
地板
i1mcu| | 2018-4-18 11:55 | 只看该作者
static uchar   bitcnt=0;
static uint   uart_buf;

static uchar  RXData0;  //用来存储接收的8位数据
static uchar   RXBitCnt0;//接收数据位数
uchar  rx_sign=0;

volatile int Send_flag=0;

void FaultRoutine(void)
{
   while(1);// 异常挂起
}
void ConfigClocks()
{
   uint i;
  for(i = 0; i < 0xFFFF; i++){};
  _BIS_SR(OSCOFF);
  if(CALBC1_1MHZ==0xff||CALDCO_1MHZ==0xff)
  {
    while(1);
  }
  BCSCTL1 = CALBC1_1MHZ;// Set range
  DCOCTL = CALDCO_1MHZ;  // Set DCO step + modulation
  BCSCTL2 |=SELM_0+DIVS_0+DIVM_0;;              // MCLK = DCO = SMCLK=1MHZ         
}
void ConfigPins()
{
  P1DIR |= TXD+LED+BIT6;
  P1SEL |=RXD;
  P1DIR &= ~RXD;                                        // P1.2 input, other outputs
  
  P1OUT |= TXD;                                                      // clear output pins
  P1OUT &=~LED;
}

//----------发送一个字节------------------------------------------//
void send_char(uchar tchar)
{
  TACTL = TACLR + TASSEL_2; //清零计数器 选择SMCLK时钟
  CCR0 = BITTIME_1b;   //crr0定时间隔为1bit时间宽度
  CCTL0 |= CCIE;      //打开CCR0中断
  bitcnt = 10;     //待发送的位数,1位开始位,8位数据位,1位停止位
  uart_buf = 0x0100;   //stop bit 停止位
  uart_buf |= tchar;  //data bit 数据位
  uart_buf <<=1;//start bit.开始位
  Send_flag = 0;
  TACTL |= MC_1; //Start TA, Timer A mode control: 1 - Up to CCR0
  _BIS_SR(GIE);
  while(!Send_flag); //wait until send complete
  Send_flag = 1;
}
//---------------------------------------------------------------------//

void RXReady(void)
{
// RXBitCnt0=0x08;//初始化接收数据计数器
  TACTL=TASSEL_2+MC_2+TACLR;//SMCLK  连续记数模式  清零计数器
  TACCTL1=CM_2+CAP+SCS+CCIE+CCIS_0;
  //下降沿捕获  同步捕获源  捕获模式  捕获中断使能  捕获输入为CCI1A
  _EINT();
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void) //串口发送程序处理过程,位操作
{
   if(bitcnt>0)
  {
    if(uart_buf & 0x01)
      POUT |= TXD;//发送数据1
    else
      POUT &= ~TXD;//发送数据0
    uart_buf >>= 1;
    bitcnt--;
  }
   else
  {
    POUT|=TXD;//默认状态置高
    TACTL &= ~MC_3; //Close the TA when a Byte send over. 00 停止模式
    CCTL0 &= ~CCIE; //关闭CCR0中断
    Send_flag = 1;
  }
}
//---------------------------------------------------------------------//

#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1 (void)  //接收串口数据处理过程,利用串口协议的时间间隔来进行。
{
               P1OUT ^= LED;
               TACCR1+=BITTIME_1b;//增加一位定时间隔
              if(TACCTL1&CAP) //判断是否为捕获模式
             {
                  RXBitCnt0=0;
              }
             switch(RXBitCnt0)
             {
                case 0:   //为捕获模式
                          RXData0=0;//清空缓冲区
                          TACCR1+=BITTIME_1b5;
                          TACCTL1&=~CAP;//改为比较模式
                          RXBitCnt0++;
                          break;   
                case 9:  //比较模式改为捕获模式
                          TACCTL1|=CAP;
                          rx_sign=1; //作为接收完毕的信号
                          break;
                default://1~8 有效数据位
                      RXData0=RXData0>>1;//右移一位,等待下一个数据进来
                      if(TACCTL1&SCCI)RXData0|=0x80;//输入为1
                      RXBitCnt0++;
                      break;
               }
}

使用特权

评论回复
5
pmp| | 2018-4-18 11:56 | 只看该作者
波特率要设置低点稳定些

使用特权

评论回复
6
mmbs| | 2018-4-18 11:56 | 只看该作者
#define RXD 0x0002 // RXD on P1.1
#define TXD 0x0002 // TXD on P2.1
#define RS485 0x0001 //enable 485 on P2.0

// Conditions for 2400 Baud SW UART, ACLK = 32768
#define Bitime_5 0x06 // ~ 0.5 bit length + small adjustment
#define Bitime 0x0E // 427us bit length ~ 2341 baud

unsigned int RXTXData;
unsigned char BitCnt;
void Delay(unsigned int i);
void TX_Byte(void);
void RX_Ready(void);

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
FLL_CTL0 |= XCAP14PF; // Configure load caps
CCTL0 |= OUT; // TXD Idle as Mark
TACTL = TASSEL_1 + MC_1; // ACLK, continous mode
P1SEL |= RXD;
P1DIR &= ~RXD;
P2SEL |= TXD;
P2DIR |= TXD;
P2DIR |= RS485;
P2OUT &= ~RS485;
_EINT();

// Mainloop
for(;;)
{
RX_Ready(); // UART ready to RX one Byte
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 Until character RXed
TX_Byte(); // TX Back RXed Byte Received
}
}

void Delay(unsigned int i)
{
unsigned char j;

for(j = 0; j < 5; j ++)
while(i--);
}

// Function Transmits Character from RXTXData Buffer
void TX_Byte(void)
{
P2OUT |= RS485;
Delay(10);
P2OUT &= ~RS485;
BitCnt = 0x0A; // Load Bit counter, 8data + ST/SP
CCR0 = TAR; // Current state of TA counter
CCR0 += Bitime; // Some time till first bit
RXTXData |= 0x0100; // Add mark stop bit to RXTXData
RXTXData = RXTXData << 1; // Add space start bit
CCTL0 = OUTMOD0 + CCIE; // TXD = mark = idle
while(CCTL0 & CCIE); // Wait for TX completion
}

// Function Readies UART to Receive Character into RXTXData Buffer
void RX_Ready(void)
{
BitCnt = 0x08; // Load Bit counter
CCTL0 = SCS + CCIS0 + OUTMOD0 + CM1 + CAP + CCIE; // Sync, Neg Edge, Capture
}

// Timer A0 interrupt service routine
interrupt [TIMERA0_VECTOR]
void TimerA0_ISR(void)
{
CCR0 += Bitime; // Add Offset to CCR0

// RX--------------------------------------------------------------------------
if(CCTL0 & CCIS0) // RX on CCI0B?
{
if(CCTL0 & CAP) // Capture mode = start bit edge
{
CCTL0 &= ~CAP; // Capture to compare mode
CCR0 += Bitime_5;
}
else
{
RXTXData = RXTXData >> 1;
if(CCTL0 & SCCI) // Get bit waiting in receive latch
RXTXData |= 0x80;

BitCnt --; // All bits RXed?
if(BitCnt == 0)
//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
CCTL0 &= ~CCIE; // All bits RXed, disable interrupt
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
}
//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
}
// TX--------------------------------------------------------------------------
else
{
if(BitCnt == 0)
CCTL0 &= ~CCIE; // All bits TXed, disable interrupt
else
{
CCTL0 |= OUTMOD2; // TX Space
if(RXTXData & 0x0001)
CCTL0 &= ~OUTMOD2; // TX Mark

RXTXData = RXTXData >> 1;
BitCnt--;
}
}
}

使用特权

评论回复
7
1988020566| | 2018-4-18 11:57 | 只看该作者
测试IO的电平信号了吗

使用特权

评论回复
8
lzbf| | 2018-4-18 11:57 | 只看该作者
都是高电平呀

使用特权

评论回复
9
houjiakai| | 2018-4-18 11:57 | 只看该作者
上传程序看看是什么原因呢

使用特权

评论回复
10
youtome| | 2018-4-18 11:58 | 只看该作者
没有代码看不出来是什么原因

使用特权

评论回复
11
cemaj| | 2018-4-18 11:58 | 只看该作者
这个说明低电平信号没有了。

使用特权

评论回复
12
updownq| | 2018-4-18 11:59 | 只看该作者
怎么不使用串口功能呢

使用特权

评论回复
13
youtome| | 2018-4-18 11:59 | 只看该作者
有可能是硬件电路设计的有问题。

使用特权

评论回复
14
houjiakai| | 2018-4-18 11:59 | 只看该作者
模拟串口的功能一般没有问题的。

使用特权

评论回复
15
lzbf| | 2018-4-18 11:59 | 只看该作者
是不是有低电平信号呢

使用特权

评论回复
16
1988020566| | 2018-4-18 11:59 | 只看该作者
如果电平信号都满足要求才可以

使用特权

评论回复
17
mmbs| | 2018-4-18 11:59 | 只看该作者
这个可能波特率不对的。

使用特权

评论回复
18
pmp| | 2018-4-18 11:59 | 只看该作者
msp430单片机定时器模拟串口

使用特权

评论回复
19
i1mcu| | 2018-4-18 11:59 | 只看该作者
定时器模拟串口可行

使用特权

评论回复
20
51xlf| | 2018-4-18 11:59 | 只看该作者
定时器的效率不怎么快的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝