chen1253 发表于 2023-11-23 21:15:08

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

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

D.lovers 发表于 2023-11-24 08:15:04

是I2c读取周边器件出问题还是usb转I2C的时候有问题,需要定位到一定范围内才行啊

chen1253 发表于 2023-11-24 09:24:32

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

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

D.lovers 发表于 2023-11-24 09:34:50

硬件I2C还是软件GPIO模拟的?挂逻分一直抓数据看看具体通信波形

陆小凤之北京 发表于 2023-11-24 10:22:52

IIC出错概率低,是否你USB回读过快呢

chen1253 发表于 2023-11-24 10:54:12

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

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

chen1253 发表于 2023-11-24 10:55:08

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

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

chen1253 发表于 2023-11-24 10:58:07

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

是软件模拟的

D.lovers 发表于 2023-11-24 11:36:47

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

chen1253 发表于 2023-11-24 16:41:07

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

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

D.lovers 发表于 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或者读完数据后输出低就行。

yangpeng012 发表于 2023-11-24 20:19:48

放弃软件模拟吧!

1a2b3c 发表于 2023-11-25 12:32:10

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

rei1984 发表于 2023-11-26 05:53:13

排错首先要缩小排查范围。
是usb通讯有问题,还是mcu的iic通讯(软件模拟)有问题。

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

armok. 发表于 2023-11-26 07:09:53

“USB转iic遇到的问题 求教”标题不合格。请自行修正。(注意:主题发出24小时后就不能修改帖子)

帖子标题必须能充分说明帖子的内容。如你要问AVR的ADC如何才能测量得比较准确,“AVR的ADC如何消除干扰测量得比较准确?”是合格的标题。不合格举例:
    1:小女子冰天雪地裸体跪求解决方法
    2:救命啊...
    3:高手请出招,一个无法解决的AVR问题
    4:一个困扰学习单片机初学者,惊动单片机开发者的难题
    5:AVR的ADC测量   (点评:你到底是问问题,或是有技术心得与大家分享?)
页: [1]
查看完整版本: USB转iic遇到的问题 求教【标题不合格】