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

[复制链接]
14853|65
xwj 发表于 2008-2-28 23:53 | 显示全部楼层

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

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

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



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

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

呵呵
xwj 发表于 2008-2-28 23:55 | 显示全部楼层

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

象这种波形还是软件模拟来得方便
 
 楼主| 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);//读系列号
 楼主| 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);//读系列号
  }
}
 楼主| hotpower 发表于 2008-2-29 00:29 | 显示全部楼层

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

xwj 发表于 2008-2-29 00:31 | 显示全部楼层

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

 楼主| hotpower 发表于 2008-2-29 00:33 | 显示全部楼层

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

 楼主| hotpower 发表于 2008-2-29 00:37 | 显示全部楼层

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

俺在写对应的作文~~~

希望俺有动脑浆的知音~~~
古道热肠 发表于 2008-2-29 12:27 | 显示全部楼层

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

关注中!
gyt 发表于 2008-2-29 14:52 | 显示全部楼层

真是聪明

佩服佩服!!!
 楼主| hotpower 发表于 2008-2-29 15:09 | 显示全部楼层

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

 楼主| hotpower 发表于 2008-2-29 15:34 | 显示全部楼层

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

wuxi_stl 发表于 2008-2-29 15:48 | 显示全部楼层
 楼主| 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);//串口初始化
}


这里应用了波特率切换来达到宽窄脉冲的实现。
 楼主| hotpower 发表于 2008-2-29 16:13 | 显示全部楼层

开始倒塌18b20~~~

1.无18b20接入时

2.有18b20接入时


哈哈~~~晚上继续~~~
phoenixmy 发表于 2008-2-29 16:19 | 显示全部楼层

刚看到美信的DS28EA00



这个也是单总线的
这个比18b20好不?
 楼主| hotpower 发表于 2008-2-29 16:21 | 显示全部楼层

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

哈哈~~~刚开始做总线复位和应答。。。
 楼主| hotpower 发表于 2008-2-29 16:23 | 显示全部楼层

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

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);
}
 楼主| hotpower 发表于 2008-2-29 16:29 | 显示全部楼层

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

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部