搜索
bottom↓
回复: 65

AVRUSB做的STK500+USB转232+I2C调试器 三合一工具

[复制链接]

出0入0汤圆

发表于 2009-6-20 14:38:53 | 显示全部楼层 |阅读模式
最近工作需要监视I2C口上的数据,花了3个通宵做了以下这个小工具,在此注明STK500协议原文件来自网上,AVRCDC串口类实现
来自网上资料,我只是把它们合起来,I2C功能则是自己做的。功能和特点:
(1)作为I2C主模式对总线发送数据
(2)可以监视到I2C总线上的其他设备发送的数据,在多主机通信中比较有用
(3)可以跳线切换为STK500 ISP下载线功能
(4)可以跳线切换为USB转串口线,输出TTL和232两种电平接口,支持大部分波特率
测试采用DS1307时钟芯片,通过发字符串进入主发送或主接收模式,同时能显示I2C总线上活动的数据内容:下面是测试图片:

(原文件名:图片.jpg)


(原文件名:0620-1308-02.JPG)


这小工具的缺点是需要2片M8芯片,一开始时我打算采用一片M8来完成所有功能的,无奈后来发现AVRUSB的中断需要较高实时性
进入中断的时间要在30uS(大概)内,因此其他中断的处理过程必须在很短,而I2C的监控也要求快速响应中断,100kbps时要求5
uS内进入并处理完毕返回,于是用另一块M8来做I2C通信用,通过串口和AVRUSB的M8联系。因此2个M8,第一个运行USB通信和USB转
串口和STK500编程功能,第二个只做为I2C通信用。M8也就6块钱,因此不是很紧要^_^.
下面是照片和全部源码公开了。
点击此处下载 ourdev_454718.rar(文件大小:1.32M) (原文件名:AVRUSB STK500+I2C+USB_COM三合一.rar)

出0入0汤圆

 楼主| 发表于 2009-6-20 14:39:39 | 显示全部楼层
沙发我的

出0入0汤圆

发表于 2009-6-20 15:13:39 | 显示全部楼层
不错,顶一下!

出0入0汤圆

发表于 2009-6-20 22:28:32 | 显示全部楼层
有时间再下,好好看看

出0入0汤圆

 楼主| 发表于 2009-6-21 21:21:09 | 显示全部楼层
没人顶呢?
我觉得I2C之所以没串口用的普遍,主要串口的调试工具非常简单,就一片max232就可观察到串口数据,而I2C口的调试一般以设备的运行情况做判断,要看I2C总线上的数据比较难.I2C尤其在多主机方面比串口优越,而又没有CAN复杂.

出0入0汤圆

发表于 2009-6-25 00:15:18 | 显示全部楼层
好东东 我正在寻找观察I2C数据的方案 哪个SSCOM软件那里可以下

出0入0汤圆

发表于 2009-6-25 08:04:17 | 显示全部楼层
阿莫,这个可以穿裤子了.

出0入0汤圆

发表于 2009-6-25 09:43:40 | 显示全部楼层
楼主,你的这些变量在哪里定义的啊 ?RF1_Idx_R  RF1_Idx_W 等,,是不是有文件没上传完啊?

出0入0汤圆

发表于 2009-6-25 09:47:13 | 显示全部楼层
用pl2303吧,比mega8便宜,模拟USB的串口太慢了

出0入0汤圆

 楼主| 发表于 2009-6-25 17:10:41 | 显示全部楼层
7楼:

__no_init u8 RF1_Idx_R @ 13;//读出位置,只度
volatile __no_init u8 RF1_Idx_W @ 14;//写入位置
有定义的,在main.c里

出0入0汤圆

 楼主| 发表于 2009-6-25 17:16:58 | 显示全部楼层
8楼:
测试通过的波特率有:128000,115200,57600,38400,19200,38400,14400,9600,4800,2400,1200,600
测试不通过的波特率有:256000,56000,110,300

感觉速度还可以

出0入0汤圆

 楼主| 发表于 2009-6-25 17:42:57 | 显示全部楼层
说下把这个USB用到你项目的方法:

char CDC_getchar(void);这个从虚拟的串口取一个字节
void CDC_putchar(char data);这个向虚拟串口发送一个字节

#define        RX_SIZE                64       /* 虚拟串口接收缓冲区尺寸(必须为2^n,16<= ~ <=256) */
#define        TX_SIZE                32       /* 虚拟窗口发送缓冲尺寸(必须为2^n) <=256 */

出0入0汤圆

发表于 2009-6-25 23:21:13 | 显示全部楼层

(原文件名:未命名.GIF)

因我是使用USB转COM口的,所以可以把CDC类去掉吧?我只需要进行I2C监视,是不是下面的硬件就可以实现了,是否可以去掉左边的AVR,把晶振放右边来..

出0入0汤圆

 楼主| 发表于 2009-6-26 09:22:31 | 显示全部楼层
是的,原理图可能有误,RST漏了,记得补上

出0入0汤圆

发表于 2009-6-27 21:16:59 | 显示全部楼层
楼上的意思是说右边的RST也和左边一样处理? 我正好不明白,因AVR是上电自动复位的,怎么一定要再加电阻电容呢?

还有另外一个问题,我这边是要去监视一个I2C,我手上有个设备,开机加电后,MCU就通过I2C给一个芯片里的OX00-2F地址共48个寄存器分别写上数据,只有这样系统才能工作,而且这个过程我们无法控制它,我是想搞清楚它分别在这48个寄存器上写上的是什么数据? 是否通过你的方案就可以用哪个SSCOM软件查询到了??? 如果一下子写48个寄存器,可能很短时间就完成,而M8还需要把这些数据转换成串口的信号让电脑软件显示出来,速度上是否能跟上? 还是M8自己先缓存到SRAM里再输出到串口?

出0入0汤圆

 楼主| 发表于 2009-6-28 15:06:28 | 显示全部楼层
是的,复位电路照左边一样.

M8自己内带缓冲的,大数据量情况我也试过,只要SCL的频率在100K以内就能正常显示

出0入0汤圆

发表于 2009-6-28 22:09:31 | 显示全部楼层
多问一个问题,如SCL的频率在100K以上的话就显示不了,那如果要确定的话怎么去测量SCL的频率呢?

出0入0汤圆

发表于 2009-6-29 02:05:51 | 显示全部楼层

出0入0汤圆

发表于 2009-6-29 13:15:54 | 显示全部楼层
支持楼主的工作

出0入0汤圆

发表于 2009-6-29 14:02:00 | 显示全部楼层

(原文件名:MEGA8做的i2c检测器.gif)

根据楼主的指导更新下I2C检测部分的电路图

出0入0汤圆

 楼主| 发表于 2009-6-29 21:45:33 | 显示全部楼层
楼上用3.3V有什么用意,你的设备是3.3伏设备?

出0入0汤圆

发表于 2009-6-29 22:35:23 | 显示全部楼层
对了 我的设备是3.3V的,USB转串口的能和3.3V兼容吗?

出0入0汤圆

发表于 2009-6-30 00:33:49 | 显示全部楼层
经过楼主确认我的是232电平,还需要增加反相器

出0入0汤圆

发表于 2009-6-30 06:59:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-30 18:49:37 | 显示全部楼层
修改下电路

(原文件名:MEGA8做的i2c检测器.gif)

出0入0汤圆

发表于 2009-7-1 07:09:48 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-7-2 23:11:16 | 显示全部楼层
reynold520 看了那个帖子的源代码, 做为跟踪I2C数据的时候,时钟线和数据线还要拉到PD2 和PD3 上

请大家注意,已经制作成功,可以跟踪到I2C数据


(原文件名:sscom32.jpg)

上图是使用该组件监视到读取24C02的01-12地址位数据的例子:
S A0a 01a R A1a BBn P--读出01地址数据为0XBB
S A0a 02a R A1a CCn P--读出02地址数据为0XCC
S A0a 03a R A1a DDn P--读出03地址数据为0XDD
S A0a 04a R A1a EEn P--读出04地址数据为0XEE
S A0a 05a R A1a FFn P--读出05地址数据为0XFF
S A0a 06a R A1a 06n P--读出06地址数据为0X06

出0入0汤圆

发表于 2009-7-3 08:21:55 | 显示全部楼层

出0入0汤圆

发表于 2009-7-7 10:27:45 | 显示全部楼层
eguy  你的跟踪的做出来了? 能把你做好后的电路图和代码发出来看下吗? 我参考做老是有点问题,不知道哪里出错了

出0入0汤圆

发表于 2009-7-7 15:58:03 | 显示全部楼层
不知道楼主的代码用的是哪个编译器啊? ICC  CVAVR  还是?   


已经知道了,是IAR 的

出0入0汤圆

发表于 2009-7-7 16:45:05 | 显示全部楼层
#pragma vector = INT1_vect
__interrupt void SDat_Change(void)
{
  ON_LED();
  u8 lv = GET_TWI_PIN();


  Uart_putchar(lv);   //这个函数为什么要发送PD 口的数据???????


  if( lv & 0x04 )
  {
    while( RF1.cnt == RF1.size );
    RF1.dat[RF1.idx_w] = lv | 0x80;
    if( ++RF1.idx_w == RF1.size )
      RF1.idx_w = 0;
    RF1.cnt++;
  }
  OFF_LED();
}


不知道这个中断函数里为什么要把PD口的数据送到数据缓冲区去通过uart 发送出去呢?

出0入0汤圆

发表于 2009-7-7 17:06:12 | 显示全部楼层
还有你的RF1 这个也是没有定义的吧? 感觉你给出的那个代码有些怪怪的,是不是还有部分没有上传还是?

出0入0汤圆

 楼主| 发表于 2009-7-7 23:45:55 | 显示全部楼层
楼上:
代码绝对是全的,中断请参考asm文件,30楼的C函数是不参与编译的.
采用asm写中断较快,从响应中断到退出中断的时间在2.5us以内

出0入0汤圆

发表于 2009-7-8 09:12:47 | 显示全部楼层
拿你打包的文件里面得那两个。asm 文件是自己写的asm 文件还是? 怎么好像是编译完成后的asm文件?

能把哪些是不需要的文件指出来吗? 因为从来没有用过IAR 的编译器,不是很明白,现在我要把文件转为GCC版本,不是很明白哪些函数要的哪些不要的

出0入0汤圆

发表于 2009-7-8 09:13:03 | 显示全部楼层
问题比较多,不好意思啊

出0入0汤圆

 楼主| 发表于 2009-7-8 09:51:04 | 显示全部楼层
asm文件是编译器帮忙的,自己修改一部分,所以有点象编译出来的.

Round_Buf.asm,TWI_Listen.c,Round_Buf.c,Round_Buf.h 是不需要的.

出0入0汤圆

发表于 2009-7-8 11:26:51 | 显示全部楼层
看了下listen.asm 的代码。。看得不是很明白,主要是逻辑没看清楚,能否大概讲下你两个中断里面做的事情呢?

出0入0汤圆

 楼主| 发表于 2009-7-8 13:33:16 | 显示全部楼层
SDA电平变化中断 -> 保护现场 -> 读PIND -> SCL是高电平吗? -> Y -> PIND值送缓冲 -> 清SDA变化中断 -> 恢复现场 ->返回
                                                |                             |
                                                 -> N ---------------->-------

SCL上升沿中断 -> 保护现场 -> 读PIND -> PIND值送缓冲 -> 恢复现场 -> 返回

总的来说,就是中断之后把PIND的值送256字节缓冲,由主程序处理.
对SDA中断,设置标志(最高位置1),该中断是总线上的Start或Stop事件.
对SCL中断,设置标志(最高位清0),该中断是总线是的1个bit.

出0入0汤圆

发表于 2009-7-8 14:03:10 | 显示全部楼层
mark一下 谢谢

出0入0汤圆

发表于 2009-7-8 16:45:29 | 显示全部楼层
已经基本移植到了GCC版本了,但是有一点不明白,如果RF1_Idx_W  RF1_Idx_R 的位置如果超出了RF1_Buf 的边界的话,没有看到对这两个变量进行重新指向数组第0位的操作啊?

在listen.c 文件里有 if( ++RF1.idx_w == RF1.size )  RF1.idx_w = 0; 这个设置,但是好像在汇编文件没有发现,

出0入0汤圆

 楼主| 发表于 2009-7-8 20:20:56 | 显示全部楼层
楼上朋友够仔细的.
由于中断偏重于运行速度,环形缓冲区有256字节,而且采用边接收边处理方式,所以就把溢出处理省略了,实际使用中是不容易溢出的.

因为主程序对缓冲区的处理速度足够快,以至于当缓冲区一有数据就被立即处理掉了.

出0入0汤圆

 楼主| 发表于 2009-7-8 20:30:19 | 显示全部楼层
环形缓冲的范围是:0x0100 - 0x01ff
RF1_Idx_W,RF1_Idx_R 是单字节的写入索引和单字节的读出索引

当到达0xff后加一自动变0了,也就省掉了指向缓冲头的操作

出0入0汤圆

发表于 2009-7-8 22:15:35 | 显示全部楼层
难怪,写得真奇妙啊

出0入0汤圆

发表于 2009-7-8 22:15:41 | 显示全部楼层
难怪,写得真奇妙啊

出0入0汤圆

发表于 2009-7-9 07:21:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-7-10 19:03:26 | 显示全部楼层
呵呵  大家都是代码级的 俺是实用级的

出0入0汤圆

发表于 2009-7-17 00:06:01 | 显示全部楼层
我用这个电路接到一个设备里边去检测I2C 但是没有成功 正在查原因.. 原系统是3.3V的,可我按电路图做的是5.0V的

也能检测到一些数据 但是貌似不是真实的数据,不知道是否应该加3.3V 到5.5V的转换

出0入0汤圆

发表于 2009-7-17 11:41:42 | 显示全部楼层
下载了,留作备用。

出0入0汤圆

发表于 2009-7-17 12:35:39 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-7-21 22:01:33 | 显示全部楼层
拿走了,谢谢

出0入18汤圆

发表于 2009-7-23 21:12:08 | 显示全部楼层
收下!!!

出0入0汤圆

发表于 2010-4-1 09:16:11 | 显示全部楼层
第一个运行USB通信和USB转
串口和STK500编程功能

我只想要这个功能,是不是就可以只用一块M8?另处还比较懒,可不可以直接提供*.hex,熔丝位设置图片,电路图?

出0入0汤圆

发表于 2010-11-4 09:49:56 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-5-3 14:07:00 | 显示全部楼层
不错,顶一个

出0入8汤圆

发表于 2011-9-28 23:47:35 | 显示全部楼层
研究一下 现在专用的usb转串口芯片比一个m8贵很多!!

出0入0汤圆

发表于 2011-10-6 19:41:13 | 显示全部楼层
顶下

出0入0汤圆

发表于 2011-10-7 11:20:24 | 显示全部楼层
AVRUSB?模拟usb时序的?

出0入0汤圆

发表于 2011-11-5 19:51:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-3-17 10:20:26 | 显示全部楼层
谢谢分享。。。

出0入0汤圆

发表于 2013-3-17 11:15:16 | 显示全部楼层
好东西,谢谢共享~~~~~~~~~~~~~~

出0入0汤圆

发表于 2013-3-19 09:00:28 | 显示全部楼层
not bad !!!

出0入0汤圆

发表于 2013-3-19 10:55:53 来自手机 | 显示全部楼层
强贴留名,晚点用电脑看看,

出0入0汤圆

发表于 2016-4-21 10:23:52 | 显示全部楼层
AVRUSB做的STK500+USB转232+I2C调试器 三合一工具    mark、

出0入0汤圆

发表于 2016-4-21 18:43:07 | 显示全部楼层
收藏备用

出0入0汤圆

发表于 2016-4-21 19:39:15 | 显示全部楼层
这个得mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 15:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表