0

关于投票
UART转HDQ16硬件控制器批量测试感觉不错~~~

hotpower 发表于 2008-3-9 16:41 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

61楼: UART转HDQ16硬件控制器批量测试感觉不错~~~

1.写2060的EEPROM
点击看大图

2.读写2060单总线
点击看大图

系统分类: 单片机
用户分类: 单总线通讯
标签: 无标签
来源: 原创
发表评论 阅读全文(296) | 回复(0)

2

关于投票
Uart转1-Wire硬件控制器程序源码例程

hotpower 发表于 2008-3-2 19:31 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: Uart转1-Wire硬件控制器程序源码例程

//UART->DS18B20
//Uart转1-Wire硬件控制器程序源码例程
//HotPower@126.com 2008.3.2 于雁塔菜地
LPC_INT8U OneWire_Start (void);
LPC_INT8U OneWire_ReadWriteByte (LPC_INT8U data);
LPC_INT8U OneWire_ReadId (LPC_INT8U *pData);

LPC_INT8U OneWire_Start (void)
{
LPC_INT8U ch;
  Uart1Config.BaudRate = BD9600;
  Uart1Config.WordLenth = WordLength8;
  Uart1Config.TwoStopBitsSelect = false;//stop=1
  UART_Init(UART1);
  UART_PutCharByPolling(UART1, 0xf0);
//ch=0xf0 无应答  ch=0xe0 有应答 ds18b20在线
  ch = UART_GetCharByPolling(UART1);
  Uart1Config.BaudRate = BD115200;
  Uart1Config.WordLenth = WordLength6;
  Uart1Config.TwoStopBitsSelect = false;//stop=1
  UART_Init(UART1);
  return ch;
}

LPC_INT8U OneWire_ReadId (LPC_INT8U *pData)
{
LPC_INT8U i, ch;
//ch=0xf0 无应答  ch=0xe0 有应答 ds18b20在线
  ch = OneWire_Start();//960us
  OneWire_ReadWriteByte(0x33);
  for (i = 0; i < 8; i ++)
  {
    pData[i] = OneWire_ReadWriteByte(0xff);//读一个字节
  }
  return ch;//返回结果
}


LPC_INT8U OneWire_ReadWriteByte (LPC_INT8U data)
{
LPC_INT8U i, ch;
LPC_INT8U value = 0;
  for (i = 0; i < 8; i ++)
  {
    if (data & 1)
    {
      UART_PutCharByPolling(UART1, 0x3f);//1
    }
    else
    {
      UART_PutCharByPolling(UART1, 0x00);//0
    }
    ch = UART_GetCharByPolling(UART1);
    data >>= 1;
    value >>= 1;
    if (ch & 0x07)//收到1T+3T个'0'为0
    {
      value |= 0x80;
    }
  }
  return value;
}

void main (void)
{
char RecData, TranBuff[30];
  if(SysInit() == 0)
  {
    // Start user program
    __enable_interrupt();
    UserStart();
  }
  
  __disable_interrupt();
  OneWire_ReadId(TranBuff);//读18b20的器件ID=28 2D 95 1D 00 00 00 22
  while(1);
}

1.读DS18B20系列码程序硬件仿真帖图



2.HotCRC计数器计算CRC8过程校验帖图


 


3.硬件接口电路

系统分类: 单片机
用户分类: 单总线通讯
标签: 无标签
来源: 原创
发表评论 阅读全文(617) | 回复(1)

2

关于投票
SPI实现单总线硬件控制器的理论研究和实现方法(菜农)
hotpower 发表于 2008-2-29 21:13 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: SPI实现单总线硬件控制器的理论研究和实现方法(菜农)

SPI实现单总线硬件控制器的理论研究和实现方法(菜农)

转载本帖应注明雁塔菜地: http://blog.ednchina.com/hotpower/
本例程未经过实战检验,若应用于产品而出错者,菜农不负任何责任,特此声明.

菜农HotPower@126.com  2008.2.29(四年等一回的日子) 于雁塔菜地

常用的单总线有2大类: 1-Wire和HDQ16

1-Wire和HDQ16都采用单线数据双向通讯,特别是有些1-Wire系列器件甚至不需电源。
单总线和I2C,SPI相比接线简单,但时序要求很严格,一般采用IO模拟定时器辅助的方法.

做主机其缺点还不太明显,若作为从机设备时,IO模拟一般还需外部中断协助.
最大特点是CPU占有率太高.甚至根本无法实现.故双机之间很少采用单总线通讯,
更别指望一主多从或多主多从通讯.

SPI实现单总线硬件控制器的接线方法很简单,为防止MOSI和单总线线与,可加二极管防止。

这样加上拉电阻并短接MISO后即构成单总线1-Wire或HDQ16.

一.单总线时序的研究:

单总线一般由3大时序构成(简化):
1.总线复位
因为在空闲时,总线由上拉电阻拉到高电平,这个状态很有"物理意义"---对从机充电.
此时从机实际是在等待或休眠状态,故必须要由外部唤醒.

为保证从机的唤醒和联接的可靠及加速单线通讯的速率,故需长时间的复位(拉低电平).
使其复位周期和数据周期拉大距离以便区分。

HDQ16的总线复位周期由190uS的低电平和45uS的高电平组成,在高电平期间不需从机应答.
1-Wire的总线复位周期由480uS的低电平和480uS的高电平组成,在高电平期间可从机应答.

1-Wire与HDQ16的最大不同在于总线复位周期里包含从机的应答时序.

2.写'0'
在空闲中总线被下拉(同步)就表示启动单总线的数据操作过程的开始.
由于总线被下拉导致通讯而阻塞(线与),故本时序只能作为主机操作过程.读回数据恒为0.

3.写'1'
这个操作实际是写'1'和读'0'及读'1'三个时序的综合.
因为TXD的开漏输出,故单总线实际就是51的准双向IO. 只有在此期间方可读取从机数据。

将写'0'和写'1'时序进一步合并后,即可实现单总线读写一体化操作.

二.SPI时序的研究:
SPI时序很简单,一般都支持4种模式. 主要由SS,SCK的开始电平状态。
这里我们只能采用模式3即SPI空闲时,SS,SCK都为高电平。
由于要将SPI做单总线控制器,故不需要SS,SCK这2个硬件信号!!!但软件必须设置SPI主机模式3。
这对于MCS/ARM/DSP等基本类同。以下只以SPI模式3举例,而且是在主机模式下。

1.协议开始
SPI本身是以SS的跳变开始一帧信号数据的传输的,数据位数一般为8位和16位。
但有的DSP的McBSP可以在128位内进行选择。
从以下的分析中可以看出位数和分辨率的关系的。
即SS下降沿启动SPI时序.

2.数据发送和接收
在SCK节拍下,SCK的下降沿一般发送数据,在上升沿接收数据。也有在同边沿收发数据的。
这要看具体硬件配置了.

3.协议结束
在传送数据期间,SS跳变到初始状态后都会强行结束一帧数据的收发.
即SS上升沿结束SPI时序.

三.SPI和1-Wire/Hdq16的不同点和共同之处
从以上分析可以看出它们的共同之处:
1.空闲状态到工作状态的切换都是采用拉低总线来唤醒从机以实现同步.(起始位S)
2.每位数据都是由一定宽度的高低电平组成.并严格保持一定的有效时间.(数据串D0D1..DX)
3.释放总线结束表示数据的结束.(停止位P)

最大的不同在于"每帧"SPI是多位(5,6,7,8等)数据位,而单总线为一位数据.
当SPI数据位串为连续的0或1时,就可组成一位单总线的数据位!!!
即该方法是用数据位数的宽度来凑够单总线的时序脉宽.

四.实现方法举例(硬件只要MOSI,MISO)
SPI和UART的不同在于它没有起始位和停止位的高低电平的固定变化.
故控制数据位模拟高低电平更加随意.但分辨率可能受到损失(8位SPI数据不如UART的一帧高)

以下只分析单总线DS18B20的实现方法,HDQ16等其他单总线类同
由于单总线的复位/应答周期需要480+480=960uS,故每位SPI数据需要960/8=120uS即BPS=8333
由于从机的应答脉宽为60~240uS,故可能收不到应答信号,不过在UART的104uS实战中是可以收到的.

总之SPI凑数算法简单,即单总线需要的周期/SPI-帧收发的位数

注意SPI一般先发送最高位.而UART一般先发送最低位.

例:(N=8)BPS=8300 T="120".48us  (1-Wire复位/应答时序)
0x0f ->00001111 即4T个0,4T个1  波形: 低电平481.92uS,  高电平481.92uS   周期:963.84uS

例:(N=8)BPS=133300 T="7".501us (1-Wire写'1'/读'0'/读'1'时序)
0x7f ->01111111 即1T个0,7T个1  波形: 低电平7.501uS, 高电平52.507uS 周期:60.008uS

例:(N=8)BPS=133300 T="7".501us (1-Wire写'0'时序)
0x01 ->00000001 即7T个0,1T个1  波形: 低电平52.507uS, 高电平7.501uS 周期:60.008uS

五.程序实现方法(待续)

5.单总线的协议硬件控制器终成正果

由于采用了SPI作为单总线的协议硬件控制器,故在传送期间不怕中断,时序不会错乱.



系统分类: 单片机
用户分类: 单总线通讯
标签: 无标签
来源: 原创
发表评论 阅读全文(368) | 回复(0)

1

关于投票
通用异步串口实现单总线硬件控制器的研究和实现方法(菜农)
hotpower 发表于 2008-2-29 15:25 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 通用异步串口实现单总线硬件控制器的研究和实现方法(菜农)

通用异步串口实现单总线硬件控制器的研究和实现方法(菜农)

转载本帖应注明雁塔菜地: http://blog.ednchina.com/hotpower/
菜农HotPower@126.com  2008.2.29(四年等一回的日子) 于雁塔菜地

常用的单总线有2大类: 1-Wire和HDQ16

1-Wire和HDQ16都采用单线数据双向通讯,特别是有些1-Wire系列器件甚至不需电源。
单总线和I2C,SPI相比接线简单,但时序要求很严格,一般采用IO模拟定时器辅助的方法.

做主机其缺点还不太明显,若作为从机设备时,IO模拟一般还需外部中断协助.
最大特点是CPU占有率太高.甚至根本无法实现.故双机之间很少采用单总线通讯,
更别指望一主多从或多主多从通讯.

在TI的HDQ16数据文档中,有文介绍用通用异步串口实现单总线硬件控制器.
但感觉只是理论推导,实际有处重大(犯罪的)错误,故感觉没经过实战论证.
也怀疑作者故意隐瞒重点。
因为下波特率为57600,8位数据位,2个停止位时,根本不可能产生190uS以上的低电平.
11*17.3uS=190.3uS不错,可停止是高电平,故只能(1+8)*17.3uS=155.7uS.
即使使用的UART可以提供16位数据,依然不能成立,为何看完此文后便知.

通用异步串口实现单总线硬件控制器的接线方法很简单,为防止TXD和RXD线与,
TI采用非门加MOS管实现TXD漏极开路,菜农采用二极管.结果一样.

这样加上拉电阻并短接RXD后即构成单总线1-Wire或HDQ16.

一.单总线时序的研究:

单总线一般由3大时序构成(简化):
1.总线复位
因为在空闲时,总线由上拉电阻拉到高电平,这个状态很有"物理意义"---对从机充电.
此时从机实际是在等待或休眠状态,故必须要由外部唤醒.

为保证从机的唤醒和联接的可靠及加速单线通讯的速率,故需长时间的复位(拉低电平).
使其复位周期和数据周期拉大距离以便区分。

HDQ16的总线复位周期由190uS的低电平和45uS的高电平组成,在高电平期间不需从机应答.
1-Wire的总线复位周期由480uS的低电平和480uS的高电平组成,在高电平期间可从机应答.

1-Wire与HDQ16的最大不同在于总线复位周期里包含从机的应答时序.

2.写'0'
在空闲中总线被下拉(同步)就表示启动单总线的数据操作过程的开始.
由于总线被下拉导致通讯而阻塞(线与),故本时序只能作为主机操作过程.读回数据恒为0.

3.写'1'
这个操作实际是写'1'和读'0'及读'1'三个时序的综合.
因为TXD的开漏输出,故单总线实际就是51的准双向IO. 只有在此期间方可读取从机数据。

将写'0'和写'1'时序进一步合并后,即可实现单总线读写一体化操作.

二.串口时序的研究:
串口一般也由3大时序构成:

1.总线复位(同步)
在空闲中总线被下拉(同步)就表示启动串口的数据操作过程的开始.即常说的"起始位S".
它也标志了双方异步过程的同步开始.双方的计时器也开始计时工作.

2.读写数据
由于无硬件同步信号,故双方必须对每个数据位的周期进行事先约定。数据串D0D1..DX

3.总线释放(停止)
为了下次(帧)通讯,必须释放总线。从而留给从机处理时间,宽度可调.
MCU一半都有1,2位停止位,1.5位很少.即常说的"停止位P".

三.UART和1-Wire/Hdq16的不同点和共同之处
从以上分析可以看出它们的共同之处:
1.空闲状态到工作状态的切换都是采用拉低总线来唤醒从机以实现同步.(起始位S)
2.每位数据都是由一定宽度的高低电平组成.并严格保持一定的有效时间.(数据串D0D1..DX)
3.释放总线结束表示数据的结束.(停止位P)

最大的不同在于"每帧"UART是多位(5,6,7,8等)数据位,而单总线为一位数据.
当UART数据位串为连续的0或1时,就可组成一位单总线的数据位!!!
即该方法是用数据位数的宽度来凑够单总线的时序脉宽.

四.实现方法举例(起始位S为低电平,停止位P为高电平,N为数据位数,B为停止为数)

例:(S=0,P=1,N=5,B=2)BPS=38400 T="34".6us (HDQ16复位时序)
0x00 ->S 00000    PP   即6T个0,2T个1 波形: 低电平207uS,  高电平69.2uS  周期:276.2uS

例:(S=0,P=1,N=6,B=1)BPS=38400 T="34".6us (HDQ16复位时序)
0x00 ->S 000001   P    即6T个0,2T个1 波形: 低电平207uS,  高电平69.2uS  周期:276.2uS

例:(S=0,P=1,N=8,B=2)BPS=38400 T="34".6us (HDQ16复位时序)
0x00 ->S 00000111 PP  即6T个0,5T个1 波形: 低电平207uS,   高电平173uS   周期:380.6uS

例:(S=0,P=1,N=8,B=2)BPS=38400 T="34".6us (HDQ16复位时序)
0x00 ->S 00000000 PP  即9T个0,2T个1 波形: 低电平311.4uS, 高电平69.2uS  周期:380.6uS

例:(S=0,P=1,N=8,B=2)BPS=57600 T="17".3us (HDQ16写'1'/读'0'/读'1'时序)
0xfe ->S 01111111 PP  即2T个0,9T个1  波形: 低电平34.6uS, 高电平155.7uS 周期:190.3uS

例:(S=0,P=1,N=8,B=2)BPS=57600 T="17".3us (HDQ16写'0'时序)
0xc0 ->S 00000011 PP  即7T个0,4T个1  波形: 低电平121.1uS,高电平69.2uS  周期:190.3uS

例:(S=0,P=1,N=8,B=1)BPS=9600 T="104us"  (1-Wire复位/应答时序)
0xf0 ->S 00001111 P   即5T个0,5T个1  波形: 低电平520uS,  高电平520uS   周期:1040uS

例:(S=0,P=1,N=6,B=1)BPS=115200 T="8".68us (1-Wire写'1'/读'0'/读'1'时序)
0x3f ->S 111111   P  即1T个0,7T个1   波形: 低电平8.68uS, 高电平60.76uS 周期:69.44uS

例:(S=0,P=1,N=6,B=1)BPS=115200 T="8".68us (1-Wire写'0'时序)
0x3f ->S 000000   P  即7T个0,1T个1   波形: 低电平60.76uS, 高电平8.68uS 周期:69.44uS

五.程序实现方法(以硬件调试通过的HDQ16为例)

1.结构配置
LPC_Uart_Config_t Uart1Config = {BD57600, WordLength8, true, false, ParitySelOdd,
                  false, true, FIFORXLEV2, IER_RBR | IER_RLS,
                  POLLING_MODE,};
2.HDQ16复位时序
void HDQStart (void);

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);//串口初始化
}

3.串口收发一体化程序代码

LPC_INT8U HDQReadWriteByte (LPC_INT8U data)
{
LPC_INT8U i, ch;
LPC_INT8U value = 0;
  for (i = 0; i < 8