打印

行有行规,**他人也要向他鞠躬敬礼~~~因为他值得你花苦心

[复制链接]
7703|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
HotPower|  楼主 | 2007-6-27 22:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
网友TestCode给了个老外的串口直接与I2C通讯的电路图,如下:



其中:

DTR控制串口窃电.

TX作为I2C的时钟信号SCL.

RTS作为PC侧SDA的数据输出.

DSR作为PC侧SDA的数据输入.

我有些愚笨,有些不明白...主要是TX的问题.

如果用Output()向串口发数据,实际是给I2C发时钟脉冲.

如发字符"U"(0x55),即在8位无校验1个停止位时,刚好是个方波信号.

即:S10101010P.其中S为起始位'0',P为停止为'1'.

也就是0101010101.即5个I2C的时钟周期.

但是在常规的编程时,TX和RX信号都是测试不了的,他们只能用函数

Output()和Input()函数操作.

这样虽然可以利用数据来发送I2C的时钟信号,那么怎样和在什么时候

发送或接收SDA上的数据呢???

难道在线程中根据给定的波特率即时间来捕捉TX信号上的跳变???

想了一天都没能想明白~~~脑子确实进水了...可是怎么也想不出来.

没办法,在TestCode给出图的瞬间,总觉得这样可能更合理些.



我的想法如下:

1.最关键的是如何测试TX的边沿.

我连了2个信号,CTS(可测试上升或下降的跳变)和RI(只能测出下降的跳变).

2.对TX的捕捉能力即时间是否跟上???

为此在不想搭上面的电路的情况下,做了下面电路的实验:



"自环"程序大概是这样的:

用Output("UU");发送I2C需要的10个SCL时钟信号.

在首个"U"的起始位"0"发出时,这是在CTS或RI上的RS232电平为10V左右.

CTS将会捕捉到comEvCTS事件.(但不能捕捉到comEvRing事件,画出它想在正规的电路上用)

在comEvCTS事件中,由于CTS为"1",所以这时控制RTS="1",导致RX线上为RS232电平10V左右

即RX收到RTS间接发来的起始位.依此类推,发完10个SCL时钟信号.

这时用Input()函数确实也收到了"数据"---"UU".即完成了软件的自环链接.

3.如何直接在RX上收到I2C的数据???

虽然发送"UU"可以得到很高的速率,但内部其中包含了2个停止位.

在真正的I2C数据通讯时,在SCL即TX的低电平(经过非门电路)是发送方放入数据的.

在SCL的高电平不允许SDA信号改变是告诉你接收方要取出数据的.

那么在硬件RS232电路内部是不会在那2个停止位上采样数据的,故"UU"组合不成立.

即2分频是不成立的.

故可采用:

8位无校验1个停止位的0x92,即

S0 1 00 1 00 1P S0 1 00 1 00 1P S0 1 00 1 00 1P

即发送3个0x92来产生9个I2C时钟(8位数据+ACK)

这样,起始位可在发送前拉低SDA简单的得到,

停止位和重复位可随便做到,如0x0f等.

也可用6位无校验1个停止位的0x26+0x3E,即

S0 11 00 1P S0 11 00 1P S0 11 00 1P S0 11 00 1P S0 11 00 1P...

这样写确实晕,不过0x26为字符"&",0x3e为字符">"

I2C时钟信号为"&&&&>"表示写7位地址+R/W+ACK的时钟序列.

若地址后带命令的停止位的完整的I2C时钟序列符为:

&&&&>&&&&&

从以上2个例子可以看出,要想用RX硬件读出数据,时钟序列中

都有"1P",即把停止位藏在一个高电平时钟后,这样就可以

"在停止位上从RX上采样到的数据"了~~~晕!!!

4.求助帮忙想想老外是如何"思想"的???

谢谢各位!!!

相关帖子

沙发
HotPower|  楼主 | 2007-6-27 23:47 | 只看该作者

坐个沙发~~~自顶一下~~~

使用特权

评论回复
板凳
HotPower|  楼主 | 2007-6-28 00:42 | 只看该作者

倒塌了~~~估计大家近来都忙着参与匠人忽悠的帅哥选美...

继续求助~~~

使用特权

评论回复
地板
lenglx| | 2007-6-28 02:14 | 只看该作者

output(0) 如何?

每使用一次output(0),相当于给一个SCL脉冲而已.在2个output()的间隔,完全可以写SDA和读SDA.

只不过没output(0x55)的效率高而已.
但你完全可以提高串口的波特率来提高SCL的速率.

使用特权

评论回复
5
conwh| | 2007-6-28 03:43 | 只看该作者

N年都没有整底层的了,真是倒塌了。整个倒塌的串口读写倒

IIC口。直接对8250操作DTR、DRS和RTS比较方便。

使用特权

评论回复
6
testcode| | 2007-6-28 04:33 | 只看该作者

直接操作倒是不错的建议

继续倒塌,除了8250 UART,还有:
    * 8259 PIC (Programmable Interrupt Controller)
    * 8086 CPU (Central Processing Unit)
    * 16450 or 16550
......

使用特权

评论回复
7
fsaok| | 2007-6-28 05:58 | 只看该作者

.

关注中

使用特权

评论回复
8
gyt| | 2007-6-28 07:15 | 只看该作者

厉害厉害

佩服一下

使用特权

评论回复
9
hotpower| | 2007-6-28 08:02 | 只看该作者

一语惊醒醒过来的人~~~

TestCode昨晚发过了个0x3c.
当时不解,回了个0x3c=0xc3???

因为0x3c为S00111100P

那我已经考虑了2分频,3分频,为什么不考虑8分频呢???

这样不就是1个字节表示一个脉冲吗???操作不是简单化了呢???

5位2个停止位 S00011PP       0x18
6位1个停止位 S000111P       0x38
7位2个停止位 S0000111PP     0x70
8位1个停止位 S00001111P     0xf0

这些不都可组成单脉冲吗???

实在是脑子进水了

使用特权

评论回复
10
古道热肠| | 2007-6-28 11:04 | 只看该作者

倒塌了!

   n年前电力出版社的一本书,大概是<<串口端口大全>>,HotPower大叔也许是看过忘掉了吗,就提到TestCode以及lenglx的方法来控制TXD线

使用特权

评论回复
11
古道热肠| | 2007-6-28 11:07 | 只看该作者

VB直接控制TXD线的子程序如下

前阵子用VB作AT89S51单片机编程器是用过这功能,速度是慢了点,但TXD完全受我控制,很爽的。
Private Sub CmdSetTXDHigh_Click()
    FrmMain.ShpTXDStatus.FillColor = vbRed
    FrmMain.MSComm1.Break = False
End Sub

Private Sub CmdSetTXDLow_Click()
    FrmMain.ShpTXDStatus.FillColor = vbGreen
    FrmMain.MSComm1.Break = True
End Sub

使用特权

评论回复
12
HotPower|  楼主 | 2007-6-28 12:31 | 只看该作者

哈哈~~~真没用过MSComm1.Break

我有本<<串口端口大全>>不知被谁拿走~~~倒塌了!!!

二教主能否再详细告之一二???

谢谢了!!!

不过俺深深地怀疑它是否在TX不接其他信号时能否捕捉到TX每个跳变沿的变化能力...

直接怀疑之中,下午做个实验~~~

使用特权

评论回复
13
HotPower|  楼主 | 2007-6-28 13:02 | 只看该作者

对0x3c的测试情况

早上上班一直不解,后突然发觉应该是6位数据模式就对了~~~
0x3c即为字符"<".
S00 1111P -->  000 11111

低电平窄估计是考虑一般下降沿为放电,故时间很快.
上升沿为充电过程,所以要慢点,故取0x3c较合理.

像:
0x38即为字符"8".
S000 111P -->  0000 1111  是个方波

0x30即为字符"0".
S0000 11P -->  00000 111 估计用在反向的接口上(0充电1放电)

测试结果还可以,如果真搭电路时,速度肯定会更高.这是我的感觉~~~

使用特权

评论回复
14
古道热肠| | 2007-6-28 13:32 | 只看该作者

MSComm的Break方法就是操作LCR的第6位

line control register (LCR) (continued)
Table 7. Number of Stop Bits Generated
BIT 2
WORD LENGTH SELECTED
BY BITS 1 AND 2
NUMBER OF STOP
BITS GENERATED
0 Any word length 1
1 5 bits 1 1/2
1 6 bits 2
1 7 bits 2
1 8 bits 2
 Bit 3: This bit is the parity enable bit. When bit 3 is set, a parity bit is generated in transmitted data between
the last data word bit and the first stop bit. In received data, if bit 3 is set, parity is checked. When bit 3 is
cleared, no parity is generated or checked.
 Bit 4: This bit is the even parity select bit. When parity is enabled (bit 3 is set) and bit 4 is set even parity
(an even number of logic 1s in the data and parity bits) is selected. When parity is enabled and bit 4 is
cleared, odd parity (an odd number of logic 1s) is selected.
 Bit 5: This bit is the stick parity bit. When bits 3, 4, and 5 are set, the parity bit is transmitted and checked
as cleared. When bits 3 and 5 are set and bit 4 is cleared, the parity bit is transmitted and checked as set.
If bit 5 is cleared, stick parity is disabled.

//---------------------------------------------------------
 Bit 6: This bit is the break control bit. Bit 6 is set to force a break condition; i.e., a condition where SOUT
is forced to the spacing (cleared) state. When bit 6 is cleared, the break condition is disabled and has no
affect on the transmitter logic; it only effects SOUT.
//-------------------------------------------------------------

 Bit 7: This bit is the divisor latch access bit (DLAB). Bit 7 must be set to access the divisor latches of the
baud generator during a read or write. Bit 7 must be cleared during a read or write to access the receiver
buffer, the THR, or the IER.

本想贴个中文的,只是那中文PDF不支持拷贝。

使用特权

评论回复
15
古道热肠| | 2007-6-28 13:54 | 只看该作者

详细地说明一下Break的功能

  MSComm控件的Break属性,用True赋值后就是设置了LCR的Bit6,使8250芯片的TXD引脚时入闪断状态,持续输出低电平0,而用Flash赋值后,恢复正常状态态,输出高电平1,属于串口的非常规应用。
  我觉得大叔用TXD做时钟控制线来模拟I2C的总线就可以了,速度慢点就慢点,调试时方便,发送0x3C是在TXD上形成一负脉冲,是否能满足要求,请细细考虑。
  我想老外肯定是用软件模拟I2C总线的,我只模拟过SPI总线,且完成了AT89S51的单片机编程。

使用特权

评论回复
16
testcode| | 2007-6-28 14:10 | 只看该作者

break的操作并非所有的Uart都支持

6位数据模式0x3c比使用break稳当。发送的脉冲为“mark-space-mark pulse”

“Unfortunately, some operating environments or hardware do
not have the necessary facilities to send an indefinitely long
BREAK. In this situation, TD can be used as a bit-pattern
generator. For example, a mark-space-mark pulse can be
transmitted by writing 0x3C to the serial port. The duration of
the pulse can be controlled with good accuracy by setting the
serial port’s baud-rate. TD was chosen to control SCL because
of this possibility of using it as a bit-pattern generator.”

使用特权

评论回复
17
dengm| | 2007-6-28 14:13 | 只看该作者

VB RS232

3个output ports:

  MSComm1.Break = False Or True       ----->> TD
  MSComm1.DTREnable = False Or True   ----->> DTR
  MSComm1.RTSEnable = False Or True   ----->> RTS

5个input ports:
  P_CD = MSComm1.CDHolding           <<---- CDC
  P_CTS = MSComm1.CTSHolding         <<---- CTS
  P_DSR = MSComm1.DSRHolding         <<---- DSR
  '------------------------
  DIM inBYTE(0) AS BYTE              <<------RD
  MSComm1.InputLen = 1
  If MSComm1.InBufferCount Then  InBYTE = MSComm1.Input
  '-------------------------

Private Sub MSComm_OnComm ()
   Select Case MSComm1.CommEvent
      CASE comEvRing  ' 6 振铃检测  <<--------  RI

      Case comEventBreak   ' 收到 Break。 -- 1001
        F_BREAK = TURE              <<------- RD
      CASE comEventFrame  ' 1004 帧错误 
        F_FRAME_ERR = TURE          <<------- RD
      CASE comEventRxParity '1009 Parity 错误 
        F_PARITY_ERR = TURE         <<------- RD
      CASE ELSE
   END SELECT
END SUB

使用特权

评论回复
18
conwh| | 2007-6-28 14:24 | 只看该作者

佩服,VB也能玩这么多的花活呀

使用特权

评论回复
19
HotPower|  楼主 | 2007-6-28 18:53 | 只看该作者

看来还是0x3c/0x30/0x38较好~~~

吃完饭再论证一下实际应用电路~~~

使用特权

评论回复
20
hq_y| | 2007-6-28 20:58 | 只看该作者

有话好好说嘛~~~~~~~~~~~对待前辈要尊敬~~~~~~~~~

使用特权

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

本版积分规则

1460

主题

21619

帖子

506

粉丝