搜索
bottom↓
回复: 14

USB转iic遇到的问题 求教【标题不合格】

[复制链接]

出0入0汤圆

发表于 2023-11-23 21:15:08 | 显示全部楼层 |阅读模式
最近用STM32F407VET6做了一个USB转IIC功能的模块,具体功能就是上位机通过高速USB外设写入控制指令,再转为IIC指令通讯从机设备,程序很简单,功能也基本实现,但是遇到问题就是在写入二三百条的读写指令的过程中,会随机的在从机寄存器地址上读到0,大概有两三条指令会出现这个情况,但是不应该读到0的,写指令一次写入4字节,读指令一般一次是读4字节或8字节,不知道是否有朋友处理过类似的情况,能指点一下

出0入4汤圆

发表于 2023-11-24 08:15:04 来自手机 | 显示全部楼层
是I2c读取周边器件出问题还是usb转I2C的时候有问题,需要定位到一定范围内才行啊

出0入0汤圆

 楼主| 发表于 2023-11-24 09:24:32 | 显示全部楼层
D.lovers 发表于 2023-11-24 08:15
是I2c读取周边器件出问题还是usb转I2C的时候有问题,需要定位到一定范围内才行啊 ...
(引用自2楼)

应该是读取器件有问题,iic线上只挂了一个设备,因为我上面重复读写的,其实就两条指令,只是寄存器地址不同,如果是转换有问题的画应该是什么都读不到的,

出0入4汤圆

发表于 2023-11-24 09:34:50 | 显示全部楼层
硬件I2C还是软件GPIO模拟的?挂逻分一直抓数据看看具体通信波形

出0入0汤圆

发表于 2023-11-24 10:22:52 | 显示全部楼层
IIC出错概率低,是否你USB回读过快呢

出0入0汤圆

 楼主| 发表于 2023-11-24 10:54:12 | 显示全部楼层
D.lovers 发表于 2023-11-24 09:34
硬件I2C还是软件GPIO模拟的?挂逻分一直抓数据看看具体通信波形
(引用自4楼)

用逻辑仪抓过,写和读指令发送的都是对的,读也是确实读到0了,逻辑仪那边也是0,但是没有每一条地址指令都看,主要太多了,而且出现的比较随机

出0入0汤圆

 楼主| 发表于 2023-11-24 10:55:08 | 显示全部楼层
陆小凤之北京 发表于 2023-11-24 10:22
IIC出错概率低,是否你USB回读过快呢
(引用自5楼)

这个怎么判断有没有过快 因为上位机那边不是我写的,上位机是不停的发送指令

出0入0汤圆

 楼主| 发表于 2023-11-24 10:58:07 | 显示全部楼层
D.lovers 发表于 2023-11-24 09:34
硬件I2C还是软件GPIO模拟的?挂逻分一直抓数据看看具体通信波形
(引用自4楼)

是软件模拟的

出0入4汤圆

发表于 2023-11-24 11:36:47 | 显示全部楼层
要考虑时钟拉伸。很多软件模拟的代码是不考虑这块的。我们是因为触摸 压感,佩戴多功能合一的IC,都是中断+I2C,碰的问题多了,就知道有可能是这个的问题。SCL不能主动拉高的,都是只能设置输入等待为高。如果不牵涉到保密,I2C代码可以放上来讨论下。

出0入0汤圆

 楼主| 发表于 2023-11-24 16:41:07 | 显示全部楼层
D.lovers 发表于 2023-11-24 11:36
要考虑时钟拉伸。很多软件模拟的代码是不考虑这块的。我们是因为触摸 压感,佩戴多功能合一的IC,都是中断+ ...
(引用自9楼)

好的 程序很简单 目前只是一个demo,整个文件太大上传不了,挑了几个主要文件上传

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2023-11-24 17:23:01 | 显示全部楼层
chen1253 发表于 2023-11-24 16:41
好的 程序很简单 目前只是一个demo,整个文件太大上传不了,挑了几个主要文件上传 ...
(引用自10楼)

#define SDA_INPUT_SET()  {GPIOB->MODER&=~(3<<(7*2));GPIOB->MODER|=0<<7*2;}        //PB5输入模式
#define SDA_OUTPUT_SET() {GPIOB->MODER&=~(3<<(7*2));GPIOB->MODER|=1<<7*2;} //PB5输出模式

#define SCL_INPUT_SET()  {GPIOB->MODER&=~(3<<(7*2));GPIOB->MODER|=0<<7*2;}        //PB5输入模式
#define SCL_OUTPUT_SET() {GPIOB->MODER&=~(3<<(7*2));GPIOB->MODER|=1<<7*2;} //PB5输出模式


void iic_start(void)
{
                SDA_INPUT_SET();
                while(READ_RDY_STATUS()==0)
                {
                       
                }       
                SCL_INPUT_SET();
                while(READ_SCL_STATUS()==0)
                {
                       
                }       
               
                SDA_OUT();
        IIC_SDA(0);
            iic_delay();
        SCL_OUT();     
        IIC_SCL(0);     /* 钳住I2C总线,准备发送或接收数据 */
            iic_delay();   
    //iic_delay();
}

/**
* @brief       产生IIC停止信号
* @param       无
* @retval      无
*/
void iic_stop(void)
{
                SDA_OUTPUT_SET();
    IIC_SDA(0);     /* STOP信号: 当SCL为高时, SDA从低变成高, 表示停止信号 */
    iic_delay();
       
    //IIC_SCL(1);
        SCL_INPUT_SET();
        while(READ_SCL_STATUS()==0)
                {
                       
                }
    iic_delay();
        SDA_INPUT_SET();
        while(READ_SDA_STATUS()==0)
                {
                       
                }
    //IIC_SDA(1);     /* 发送I2C总线结束信号 */
   // iic_delay();
}

我修改了大概的一些代码,把主动输出的更改为设置输入,等待为高。更完善的代码是增加超时结束,返回对应的出错码。其他主动输出为高的地方都设置为输入 等待为高后延时2uS或者读完数据后输出低就行。

出0入4汤圆

发表于 2023-11-24 20:19:48 | 显示全部楼层
放弃软件模拟吧!

出0入475汤圆

发表于 2023-11-25 12:32:10 来自手机 | 显示全部楼层
我想楼主好几个概念没有搞清楚
1.速度匹配问题,usb与电脑通讯的速度能不能与你mcu去外面采集iic信息的速度?你居然说你不知道。。。iic是你自己在掌控,读写一个数据要多长时间你自己不知道?各种软硬件的方法去核对啊,示波器也好,mcu自己内部计时也好,太多了,还有程序流程上判断,上位机发新的指令后看看上一条指令是不是已经回复完了,等等各种方法;或者干脆一问一答的系统交互方式都可以避免速度不匹配问题,
2.读到iic信息是0? 这个更简单,首先你搞定iic没有,iic读到零到底是你真的mcu读回来就已经是零还是说你回传电脑过程中其它原因导致变成零。 随便弄个串口把数据打印出来看看不就啥都清清楚楚了吗?mcu读到后的,上传电脑前的,都打印出来,一目了然。。。 什么?串口打印太慢了?你打快一点啊,弄三五兆的波特率打印不行吗?你不是说还要逻辑仪嘛,
3,未完待续,,

出0入25汤圆

发表于 2023-11-26 05:53:13 来自手机 | 显示全部楼层
排错首先要缩小排查范围。
是usb通讯有问题,还是mcu的iic通讯(软件模拟)有问题。

我感觉iic软件模拟出问题的较大。debug可以用check io 翻转。比串口来的快

出16170入6148汤圆

发表于 2023-11-26 07:09:53 来自手机 | 显示全部楼层
“USB转iic遇到的问题 求教”标题不合格。请自行修正。(注意:主题发出24小时后就不能修改帖子)

帖子标题必须能充分说明帖子的内容。如你要问AVR的ADC如何才能测量得比较准确,“AVR的ADC如何消除干扰测量得比较准确?”是合格的标题。不合格举例:
    1:小女子冰天雪地裸体跪求解决方法
    2:救命啊...
    3:高手请出招,一个无法解决的AVR问题
    4:一个困扰学习单片机初学者,惊动单片机开发者的难题
    5:AVR的ADC测量   (点评:你到底是问问题,或是有技术心得与大家分享?)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-29 14:36

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

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