打印

IO口模拟串口的例程

[复制链接]
899|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tian111|  楼主 | 2019-12-16 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件限制,需要用IO口模拟个串口收发功能。115200波特率的。

使用特权

评论回复
沙发
yufe| | 2019-12-16 21:40 | 只看该作者
我最近倒是写了一个,115200的,GD103的芯片,就不知道怎么传上来

使用特权

评论回复
板凳
langgq| | 2019-12-16 21:42 | 只看该作者

void U4_TxB(u8 da)
{ u8 i;
        u16 t;

//  S4Ce(1);//ʹÄÜ·¢ËÍ
        S4Tx(0);//·¢ËÍÆðʼλ
  for(t=0;t<78;)//ÑÓʱ8.68us/78
        { t++;}
        for(i=0;i<8;i++)
        { if(da & 0x80){ S4Tx(1);}
                else{ S4Tx(0);}
                da<<=1;
           for(t=0;t<78;)//ÑÓʱ8.6us/77
          { t++;}
        }
        S4Tx(1);//·¢ËÍֹͣλ
        for(t=0;t<78;)//ÑÓʱ8.64us/78
        { t++;}
}

使用特权

评论回复
地板
huwr| | 2019-12-16 21:45 | 只看该作者

u8 U4_RxB(void)
{ u8 i,da=0;
        u16 t;

        while(S4Rx)i++; //µÈ´ýµÍ
        { if(i>80)return 0xFF;}
        for(t=0;t<78;)//ÑÓʱ8.68us/79
        { t++;}//ÆðʼλL
        for(t=0;t<35;)//ÑÓʱ4.08us(0.5bit/4.32us/37)
        { t++;}
        for(i=0;i<7;i++)//0.23us
        { if(S4Rx) da|=0x01;
                da<<=1;
           for(t=0;t<76;)//8.48/77ÑÓʱ(8.68us/79)
          { t++;}
        }
        if(S4Rx) da|=0x01;
        for(t=0;t<35;)//ÑÓʱ3.04,(4.08us/35)
        { t++;}
        while(!(S4Rx)); //µÈ´ý¸ß,ֹͣλH

        return da;
}

使用特权

评论回复
5
huanghuac| | 2019-12-16 21:48 | 只看该作者

测试是过了的,如果有什么不妥,希望能提供给我

使用特权

评论回复
6
bqyj| | 2019-12-16 21:52 | 只看该作者

这个需要借助定时器的

使用特权

评论回复
7
tian111|  楼主 | 2019-12-16 21:54 | 只看该作者

我记得我原来做个这个的,,采用定时器的捕获功能的

使用特权

评论回复
8
17865311960| | 2020-2-21 17:27 | 只看该作者
有大神能不能告诉我用到了那些资源啊?

使用特权

评论回复
9
lvben5d| | 2020-2-23 18:53 | 只看该作者
IO居然模拟串口,选型是否有问题,如果不得不为之,先了解串口的工作时序,本地IO模拟串口发送相对接单因为是组塞模式(记得关全局中断再发),  接收就麻烦多了,需要开中断,并配合定时器采集接收的波形。

使用特权

评论回复
10
xdqfc| | 2020-2-25 10:21 | 只看该作者
lvben5d 发表于 2020-2-23 18:53
IO居然模拟串口,选型是否有问题,如果不得不为之,先了解串口的工作时序,本地IO模拟串口发送相对接单因为 ...

你就让他们折腾去吧。

使用特权

评论回复
11
lxs0026| | 2020-2-25 18:08 | 只看该作者


void U4_TxB(u8 da)
{ u8 i;
        u16 t;

//  S4Ce(1);//ʹÄÜ·¢ËÍ
        S4Tx(0);//·¢ËÍÆðʼλ
  for(t=0;t<78;)//ÑÓʱ8.68us/78
        { t++;}
        for(i=0;i<8;i++)
        { if(da & 0x80){ S4Tx(1);}
                else{ S4Tx(0);}
                da<<=1;
           for(t=0;t<78;)//ÑÓʱ8.6us/77
          { t++;}
        }
        S4Tx(1);//·¢ËÍֹͣλ
        for(t=0;t<78;)//ÑÓʱ8.64us/78
        { t++;}
}
好像不能直接用,哈哈哈

使用特权

评论回复
12
lxs0026| | 2020-2-25 18:09 | 只看该作者
115200波特率的。

使用特权

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

本版积分规则

797

主题

8878

帖子

7

粉丝