发新帖我要提问
12
返回列表
打印

要用三个串口传数据,MSP430该怎么去解决这个问题

[复制链接]
楼主: 曳影zsg
手机看帖
扫描二维码
随时随地手机跟帖
21
曳影zsg|  楼主 | 2016-10-11 19:57 | 只看该作者 回帖奖励 |倒序浏览
liukeyi 发表于 2016-10-11 11:22
我是小白哈,问一下,为啥不直接主从机片选啊,这个只要有使能端口不是想挂几个挂几个吗? ...

我的接收方不能进行编程

使用特权

评论回复
22
曳影zsg|  楼主 | 2016-10-11 19:59 | 只看该作者
cehuafan 发表于 2016-10-10 22:05
三个串口什么意思?就是发送就行了。

不只有接收

使用特权

评论回复
23
pklong| | 2016-10-12 16:04 | 只看该作者
串口接受都是设置成为中断接受。

使用特权

评论回复
24
pklong| | 2016-10-12 16:05 | 只看该作者
三个串口是配置的问题难?

使用特权

评论回复
25
datouyuan| | 2016-10-13 17:00 | 只看该作者
如果仅有mcu是主动发,其它设备只能应答,硬件做个选通,就可以了,再多几个串口都没事.

另外加入能自己安排协议的话,一个串口就能连接多个设备了.

使用特权

评论回复
26
曳影zsg|  楼主 | 2016-10-14 19:34 | 只看该作者
neomissing 发表于 2016-10-6 11:12
用定时器模拟串口,我之前一个430中继器支持 5个串口

我在网上找了个程序,照这里面的的要求,波特率设了2400,我用了一个usb转TTL模块接了电脑,在程序里面设定发送一个变量b=1,用串口调试助手测试,但是没接收到。程序在下面,麻烦您看看有啥问题,谢谢了
#include "msp430.h"

#define TBIT1 14;            //TBIT1为1位时间
#define TBIT_5 6;            //TBIT_5为半位时间
#define TXD 0x0002
#define RXD 0x0004           //发送允许位
#define TEN 0x0001         
#define DE485 0x0001          //485允许发送控制

unsigned char b=1,GBIT=0x00;     //通用位区
unsigned int TR_COUNT;       //发收计数器
unsigned int T_DATA=0x00;    //发送缓冲器
unsigned int R_DATA=0x00;    //接收缓冲器

void init(void);  
void txd(unsigned char byte);        //发送一字节数据
void rxd(void);                      //接受准备子程序


/************  主程序 *********************/
void main()
{
  init();
  //P2DIR|=BIT0;
  //P2OUT|=BIT0;
  while(1)
  {
    rxd();          //准备接受
    txd(b);
    LPM3;
  }
}

/************初始化程序*************/
void init(void)
{
  WDTCTL = WDTPW + WDTHOLD;
  P1DIR|=BIT0;            //P1.0设为输出
  P1OUT&=~BIT0;          //设DE485=0;--485接收允许  
  
  P1DIR|=TXD;           //P1.1设为输出TXD
  P1SEL|=TXD;           //P1.1设为使用外围模块
  P2DIR&=~RXD;          //p2.2设为输入RXD
  P2SEL|=RXD;          //P2.2设为使用外围模块
  
  CCTL0|=OUT;          //ccro的out设1

  TACTL|=TASSEL0+MC0;   //设定时器A时钟源ACLK ,定时器为连续模式,启动计时
  
  _EINT();    //中断允许
  
}

/*************发送一个字节数据子程序*************/
void txd(unsigned char byte)
{
  T_DATA=byte;
  CCR0=TAR;                  //将TAR时间存入CCR0,确定第一位的长度
  CCR0=CCR0+TBIT1;           //将每1位时间周期加入CCR0
  T_DATA=T_DATA<<1;          //将字节数据向左移一位,构造最低位为起始位
  T_DATA=T_DATA|0X0200;      //将字节的第10位设为1,以作停止位使用
  TR_COUNT=10;               //发送计数器
  P1OUT|=DE485;
  
  CCTL0=OUTMOD0+CCIE;        //重新设置CCTL0(CCIS1-0=00)
                             //捕获/比较模块输出模式1,允许模块中断
  while(CCIE&CCTL0);         //等待CCIE是否为0?为真,则表示发送完数据
  
}

/**********接收数据函数**************/
void rxd(void)
{
  TR_COUNT=8;                //接收数据位的位数
  CCTL0=OUTMOD0+CCIE+CM1+CAP+CCIS0+SCS;
      //设置比较捕获控制寄存器0的设置
    //比较捕获为输出模式+比较捕获模块为中断允许+下降沿捕获+设置为捕获模式
     //+选择CCI0B为捕获源+同步捕获
  P1OUT&=~DE485;
}


#pragma vector=TIMERA0_VECTOR
__interrupt void cc10int(void)
{
  CCR0=CCR0+TBIT1;
  
  if(CCIS0&CCTL0)
  {
    if(CCTL0&CAP)
    {
      CCTL0&=~CAP;
      CCR0=CCR0+TBIT_5;
    }
    else
    {
      R_DATA=R_DATA>>1;
      if(CCTL0&SCCI)
        R_DATA|=0X80;
      TR_COUNT--;
      if(TR_COUNT==0)
      {
        CCTL0&=~CCIE;
        LPM3_EXIT;
      }
    }
  }
  
  else
  {
    if(TR_COUNT==0)
      CCTL0&=~CCIE;
    else
    {
      if(T_DATA&0X0001)
        CCTL0&=~OUTMOD2;
      else
        CCTL0|=OUTMOD2;
      T_DATA=T_DATA>>1;
      --TR_COUNT;
    }
  }
}

使用特权

评论回复
27
1988020566| | 2016-10-16 17:19 | 只看该作者
现在的M3很多的串口。

使用特权

评论回复
28
1988020566| | 2016-10-16 17:19 | 只看该作者
推荐TIVA的产品试试。

使用特权

评论回复
29
曳影zsg|  楼主 | 2016-11-7 20:45 | 只看该作者
neomissing 发表于 2016-10-6 11:12
用定时器模拟串口,我之前一个430中继器支持 5个串口

请问您有可用的例子可以借我参考参考吗?

使用特权

评论回复
30
lihuami| | 2016-11-7 22:03 | 只看该作者
一个是利用串口芯片实现。

使用特权

评论回复
31
lihuami| | 2016-11-7 22:05 | 只看该作者
还有就是使用TIva的产品,串口比较多。

使用特权

评论回复
32
曳影zsg|  楼主 | 2016-11-8 22:28 | 只看该作者
lihuami 发表于 2016-11-7 22:03
一个是利用串口芯片实现。

您能告诉我有哪些型号我可以用吗

使用特权

评论回复
33
chuntian2016| | 2016-11-10 21:44 | 只看该作者
那第三个就只能是采用模拟的串口了,不过性能上是要差些的

使用特权

评论回复
34
chuntian2016| | 2016-11-10 21:44 | 只看该作者
尽量用的波特率的跟提供的时钟源成倍数关系的。

使用特权

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

本版积分规则