USB转iic遇到的问题 求教【标题不合格】
最近用STM32F407VET6做了一个USB转IIC功能的模块,具体功能就是上位机通过高速USB外设写入控制指令,再转为IIC指令通讯从机设备,程序很简单,功能也基本实现,但是遇到问题就是在写入二三百条的读写指令的过程中,会随机的在从机寄存器地址上读到0,大概有两三条指令会出现这个情况,但是不应该读到0的,写指令一次写入4字节,读指令一般一次是读4字节或8字节,不知道是否有朋友处理过类似的情况,能指点一下 是I2c读取周边器件出问题还是usb转I2C的时候有问题,需要定位到一定范围内才行啊 D.lovers 发表于 2023-11-24 08:15是I2c读取周边器件出问题还是usb转I2C的时候有问题,需要定位到一定范围内才行啊 ...
(引用自2楼)
应该是读取器件有问题,iic线上只挂了一个设备,因为我上面重复读写的,其实就两条指令,只是寄存器地址不同,如果是转换有问题的画应该是什么都读不到的, 硬件I2C还是软件GPIO模拟的?挂逻分一直抓数据看看具体通信波形 IIC出错概率低,是否你USB回读过快呢 D.lovers 发表于 2023-11-24 09:34
硬件I2C还是软件GPIO模拟的?挂逻分一直抓数据看看具体通信波形
(引用自4楼)
用逻辑仪抓过,写和读指令发送的都是对的,读也是确实读到0了,逻辑仪那边也是0,但是没有每一条地址指令都看,主要太多了,而且出现的比较随机 陆小凤之北京 发表于 2023-11-24 10:22
IIC出错概率低,是否你USB回读过快呢
(引用自5楼)
这个怎么判断有没有过快 因为上位机那边不是我写的,上位机是不停的发送指令 D.lovers 发表于 2023-11-24 09:34
硬件I2C还是软件GPIO模拟的?挂逻分一直抓数据看看具体通信波形
(引用自4楼)
是软件模拟的 要考虑时钟拉伸。很多软件模拟的代码是不考虑这块的。我们是因为触摸 压感,佩戴多功能合一的IC,都是中断+I2C,碰的问题多了,就知道有可能是这个的问题。SCL不能主动拉高的,都是只能设置输入等待为高。如果不牵涉到保密,I2C代码可以放上来讨论下。 D.lovers 发表于 2023-11-24 11:36
要考虑时钟拉伸。很多软件模拟的代码是不考虑这块的。我们是因为触摸 压感,佩戴多功能合一的IC,都是中断+ ...
(引用自9楼)
好的 程序很简单 目前只是一个demo,整个文件太大上传不了,挑了几个主要文件上传 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或者读完数据后输出低就行。 放弃软件模拟吧! 我想楼主好几个概念没有搞清楚
1.速度匹配问题,usb与电脑通讯的速度能不能与你mcu去外面采集iic信息的速度?你居然说你不知道。。。iic是你自己在掌控,读写一个数据要多长时间你自己不知道?各种软硬件的方法去核对啊,示波器也好,mcu自己内部计时也好,太多了,还有程序流程上判断,上位机发新的指令后看看上一条指令是不是已经回复完了,等等各种方法;或者干脆一问一答的系统交互方式都可以避免速度不匹配问题,
2.读到iic信息是0? 这个更简单,首先你搞定iic没有,iic读到零到底是你真的mcu读回来就已经是零还是说你回传电脑过程中其它原因导致变成零。 随便弄个串口把数据打印出来看看不就啥都清清楚楚了吗?mcu读到后的,上传电脑前的,都打印出来,一目了然。。。 什么?串口打印太慢了?你打快一点啊,弄三五兆的波特率打印不行吗?你不是说还要逻辑仪嘛,
3,未完待续,, 排错首先要缩小排查范围。
是usb通讯有问题,还是mcu的iic通讯(软件模拟)有问题。
我感觉iic软件模拟出问题的较大。debug可以用check io 翻转。比串口来的快
“USB转iic遇到的问题 求教”标题不合格。请自行修正。(注意:主题发出24小时后就不能修改帖子)
帖子标题必须能充分说明帖子的内容。如你要问AVR的ADC如何才能测量得比较准确,“AVR的ADC如何消除干扰测量得比较准确?”是合格的标题。不合格举例:
1:小女子冰天雪地裸体跪求解决方法
2:救命啊...
3:高手请出招,一个无法解决的AVR问题
4:一个困扰学习单片机初学者,惊动单片机开发者的难题
5:AVR的ADC测量 (点评:你到底是问问题,或是有技术心得与大家分享?)
页:
[1]