打印

1-Wire/HDQ16等单总线终被菜农倒塌,发帖自贺~~~

[复制链接]
楼主: hotpower
手机看帖
扫描二维码
随时随地手机跟帖
21
xwj| | 2008-2-28 23:53 | 只看该作者 回帖奖励 |倒序浏览

呵呵,用硬件UART?好像没法得到HDQ需要的波形啊

象这种波形好事软件模拟来得方便

单线通讯其实还是很容易实现的,
如果是自己做的设备间通信,UART有多的话我也宁愿直接用硬件UART,信号与TXD送出,这样更节约资源
而很多时候UART根本不够用,当然只能软件模拟了,这是甚至只需要一个IO,又节约那么一点点:-)



至于电路,TI 的文档也不能算错,也是可以正常工作的!
象你上面的电路如果吧1N4148换成肖特基管,会更好一点,不过一般无所谓啦,CMOS电平的话反正在正常范围内

而且,如果是机外通讯的话,不建议信号线未经保护、隔离的直接接入MCU,否则在工地、现场很容易因信号线感应过强干扰信号或过强的共模、差模电压而损坏MCU
此时有另外的简单可靠电路,但不准备公布:-)

呵呵

使用特权

评论回复
22
xwj| | 2008-2-28 23:55 | 只看该作者

比如用硬件UART,很难实现HDQ的这种波形:

象这种波形还是软件模拟来得方便
 

使用特权

评论回复
23
hotpower|  楼主 | 2008-2-29 00:02 | 只看该作者

哈哈~~~HDQ16有标准的接口电路~~~俺以通过实战交付用户~~~

文档中有个关键的错误~~~肯定是不行的~~~

以下是串口查询等待的例程,如果是用中断+FIFO或DMA,会是什么样呢???

LPC_INT8U HDQReadWriteByte (LPC_INT8U data)
{
LPC_INT8U i, ch;
LPC_INT8U value = 0;
  for (i = 0; i < 8; i ++)
  {
    if (data & 1)
    {
      UART_PutCharByPolling(UART1, 0xfe);//1
    }
    else
    {
      UART_PutCharByPolling(UART1, 0xc0);//0
    }
    ch = UART_GetCharByPolling(UART1);
    data >>= 1;
    value >>= 1;
    if (ch > 0xf8)
    {
      value |= 0x80;
    }
  }
  return value;
}

//....
data = HDQReadWriteData(0x1c);//读系列号

使用特权

评论回复
24
hotpower|  楼主 | 2008-2-29 00:16 | 只看该作者

HDQReadWriteWord()一样简单

LPC_INT8U HDQReadWriteWord (LPC_INT16U data)
{
LPC_INT8U i, ch;
LPC_INT16U value;
  for (i = 0; i < 16; i ++)
  {
    if (data & 1)
    {
      UART_PutCharByPolling(UART1, 0xfe);//1
    }
    else
    {
      UART_PutCharByPolling(UART1, 0xc0);//0
    }
    ch = UART_GetCharByPolling(UART1);
    data >>= 1;
    value >>= 1;
    if (ch > 0xf8)
    {
      value |= 0x8000;
    }
  }
  return value;
}


读写一体化俺是最喜欢的~~~

LPC_INT16U  HDQReadWriteData (LPC_INT8U command)
{
//LPC_INT8U valuel, valueh;
LPC_INT16U value;
  HDQStart();//190us
  HDQReadWriteByte(command);//发送8位命令
//  valuel = HDQReadWriteByte(0xff);//接收8位数据
//  valueh = HDQReadWriteByte(0xff);//接收8位数据
//  value = (valueh << 8) | valuel;
  valuel = HDQReadWriteWord(0xffff);//接收16位数据
  return value;//返回16位数据
}

void main (void)
{
LPC_INT16U data = 0;
  while(1)
  {
    data = HDQReadWriteData(0x1c);//读系列号
  }
}

使用特权

评论回复
25
hotpower|  楼主 | 2008-2-29 00:29 | 只看该作者

哈哈~~~xwj猜猜HDQStart();是如何实现的~~~这个是倒塌思考题~~~

使用特权

评论回复
26
xwj| | 2008-2-29 00:31 | 只看该作者

看不错你用硬件UART的好处和意义,解释解释看啊

使用特权

评论回复
27
hotpower|  楼主 | 2008-2-29 00:33 | 只看该作者

哈哈~~~理解多任务多1-Wire器件查询的人做梦都在想这个~~~

使用特权

评论回复
28
hotpower|  楼主 | 2008-2-29 00:37 | 只看该作者

哈哈~~~累了~~~请像菜农一样爱动脑浆的人来解这个"弱智题"吧

俺在写对应的作文~~~

希望俺有动脑浆的知音~~~

使用特权

评论回复
29
古道热肠| | 2008-2-29 12:27 | 只看该作者

哈哈,大家都来看Hotpower能否倒塌成功

关注中!

使用特权

评论回复
30
gyt| | 2008-2-29 14:52 | 只看该作者

真是聪明

佩服佩服!!!

使用特权

评论回复
31
hotpower|  楼主 | 2008-2-29 15:09 | 只看该作者

哈哈~~~SPI倒塌单总线理论上也成功~~~

使用特权

评论回复
32
hotpower|  楼主 | 2008-2-29 15:34 | 只看该作者

作文上交,下次再来个SPI倒塌单总线硬件控制器的研究和实

使用特权

评论回复
33
wuxi_stl| | 2008-2-29 15:48 | 只看该作者

mark

使用特权

评论回复
34
hotpower|  楼主 | 2008-2-29 15:54 | 只看该作者

HDQStart()的正解---倒塌成功的功臣~~~

void HDQStart (void)
{
LPC_INT8U ch;
  Uart1Config.BaudRate = BD38400;//改写波特率用于发送复位信号
  UART_Init(UART1);//串口初始化
  UART_PutCharByPolling(UART1, 0);//发送低电平311.4uS,  高电平69.2uS
  ch = UART_GetCharByPolling(UART1);//清空并监测应答或干扰信号等
  Uart1Config.BaudRate = BD57600;//改写波特率用于发送接收数据
  UART_Init(UART1);//串口初始化
}


这里应用了波特率切换来达到宽窄脉冲的实现。

使用特权

评论回复
35
hotpower|  楼主 | 2008-2-29 16:13 | 只看该作者

开始倒塌18b20~~~

1.无18b20接入时

2.有18b20接入时


哈哈~~~晚上继续~~~

使用特权

评论回复
36
phoenixmy| | 2008-2-29 16:19 | 只看该作者

刚看到美信的DS28EA00



这个也是单总线的
这个比18b20好不?

使用特权

评论回复
37
hotpower|  楼主 | 2008-2-29 16:21 | 只看该作者

哈哈~~~这个实验的1820是俺93年在北京买的,一直没用~~~

哈哈~~~刚开始做总线复位和应答。。。

使用特权

评论回复
38
hotpower|  楼主 | 2008-2-29 16:23 | 只看该作者

虽然久不研究,但功底还在~~~

使用特权

评论回复
39
wkman| | 2008-2-29 16:27 | 只看该作者

这都是些什么晕菜的错误???一看就知道不能用的。

{
   uchar i,crc_data=0;
for(i=0;i    crc_data = CrcTable[crc_data^temp_buff]];
    return (crc_data);
}

使用特权

评论回复
40
hotpower|  楼主 | 2008-2-29 16:29 | 只看该作者

哈哈~~~网上骗子多~~~俺从不相信任何现成的程序~~~永远自己

使用特权

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

本版积分规则