您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF518的I2C问题
本帖共有2866个阅读者
发表帖子 发表投票 回复主题
BF518的I2C问题
unconscious(论坛新手)
unconscious
头衔:社区公民
帮派:无帮无派
帖数:67
金钱:746
积分:86
注册时间:2013/8/2
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF518的I2C问题

之前的帖子发不了图了,所以发了新帖。谢谢andy回答。

偶尔能写成功,偶尔写不成功。还是之前的程序,时序什么的都没有改,我循环写入(0x11,0x6e)测试看波形,波形如下图:


上传的图片
  201310151520395.png [ 939.33 KB 720×708 ] (缩略时请点击查看原图)

 



设备地址是0x80。黄色的是SDA,蓝色的是SCL,SDA中有很多不均匀的毛刺不知道是什么原因?我打印了I2C时序中的i2c_read_ack函数的返回值(应该是ACK吧),发现此值为1时就写错。
循环写入其他的寄存器和值进去发现波形差不多是对的。打印输出是偶尔写错误,大部分时间是写入正确的。
硬件上我接线,电压都是正常的,不知道还有什么原因?很迷茫啊



「该帖子被 unconscious 在 2013-11-12 09:53:34 编辑过」

^_^
等级:论坛新手 参考IP地址:*.*.*.*
2013/10/15 15:27:49
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
如果是飞线连接的话,可能会引入很多噪声的,你把IIC的速度配慢一点,图上看,黄线的ACK响应的信号堆成一块,通常是噪声和负载过大,或者数据线上容性过大造成的,你速度配置慢一点,或许能缓解这个信号。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/10/15 17:49:41
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
可以用优化关闭指令 ,防止延时函数优化:

#pragma optimize_off

指令放在定义延时函数的前面。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/10/15 20:12:11
unconscious(论坛新手)
unconscious
头衔:社区公民
帮派:无帮无派
帖数:67
金钱:746
积分:86
注册时间:2013/8/2
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

谢谢,
我试了,还是不行。。就直接像下面这样   对吗

#pragma optimize_off
void delay(int tem)
{
    int j,i;
    for(i=tem;i>0;i--)
    {
        for(j=1000;j>0;j--)
        {
            j=j;
        }
    }
}

我明天再看看,我现在用的是模拟I2C,不行的话我改成硬件的,不知道会不会有用?



「该帖子被 unconscious 在 2013-10-15 21:00:41 编辑过」

^_^
等级:论坛新手 参考IP地址:*.*.*.*
2013/10/15 20:46:36
unconscious(论坛新手)
unconscious
头衔:社区公民
帮派:无帮无派
帖数:67
金钱:746
积分:86
注册时间:2013/8/2
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

问题1、我改成硬件I2C了,用的void TWI_MasterMode_Write(unsigned short DeviceAddr, unsigned short *TWI_Data_Pointer, unsigned short TX_Count, unsigned short TWI_TX_Length)函数。因为没有返回值,没法查看是否写入错误。

但是VSYNC、HSYNC和PPICLK都有波形出来,也是正常的。也可以进中断函数:

EX_INTERRUPT_HANDLER(DMA0_PPI_ISR)
{    
        CMOS_PPI_Disable();
        *pDMA0_IRQ_STATUS = 0x1;  
        DEBUG_STATEMENT( "\nSuccess Capture One Frame:  1280 * 480\n");
}

这样是不是说明I2C已经配置好了呢?

问题2:使用硬件I2C发现速度特别慢,因为我要写入的寄存器个数大概有700个左右,请问可以使速度加快吗?



「该帖子被 unconscious 在 2013-10-16 15:02:35 编辑过」

^_^
等级:论坛新手 参考IP地址:*.*.*.*
2013/10/16 14:52:53
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你可以用示波器看一下配置之前和配置之后波形有何变化来断定,通常能跑出硬件IIC代码的,都可以认为是配置好了。
记得TWI有改速度的地方,有的时候配置值返回错误,反复配置,也会消耗大量时间,你可以看一下代码,在配置值错误,重复配置时,加入一些输出信息的语句,用来判断是否因为重复配置而消耗时间。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/10/17 13:34:28
unconscious(论坛新手)
unconscious
头衔:社区公民
帮派:无帮无派
帖数:67
金钱:746
积分:86
注册时间:2013/8/2
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

谢谢andy,我用的硬件I2C,应该是通了。

现在两个CMOS的VSYNC1、HSYNC1、PPICLK1和VSYNC2、PPICLK2都有波形出来了,但是HSYNC2没有波形,以下是采集的设置,

void Video_Frame_Capture(void)
{

    *pPPI_FRAME   = 480;          
   *pPPI_COUNT   = 2559;    //1280*480      
    *pPPI_DELAY   = 0;    
    *pPPI_CONTROL = 0x39AC;      //POLS POLC all 0

    *pDMA0_START_ADDR = databuf;    
    *pDMA0_X_COUNT    = 1280;
    *pDMA0_X_MODIFY   = 0x2;            
    *pDMA0_Y_COUNT    = 480;    
    *pDMA0_Y_MODIFY   = 0x2;                                                    
    *pDMA0_PERIPHERAL_MAP = 0x0;
   *pDMA0_CONFIG         =  WNR | WDSIZE_16| DMA2D | DI_EN;   //WDSIZE_16
    *pDMA0_CONFIG        |= DMAEN;
    ssync();
    *pPPI_CONTROL        |= PORT_EN;
    ssync();
              
}

不知道是哪里出了问题?


^_^
等级:论坛新手 参考IP地址:*.*.*.*
2013/10/21 10:10:45
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
检查你的硬件吧,CMOS采集时,同步和时钟信号都是从CMOS出来的,和你的DSP配置没有关系。如果IIC配置值没有问题,就检查你的硬件。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/10/21 11:19:50
unconscious(论坛新手)
unconscious
头衔:社区公民
帮派:无帮无派
帖数:67
金钱:746
积分:86
注册时间:2013/8/2
8信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

恩  懂了。

是信号线接触不良造成的。谢谢啦


^_^
等级:论坛新手 参考IP地址:*.*.*.*
2013/10/21 11:40:26
unconscious(论坛新手)
unconscious
头衔:社区公民
帮派:无帮无派
帖数:67
金钱:746
积分:86
注册时间:2013/8/2
9信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

PPI、DMA的设置如下:

void Video_Frame_Capture(void)
{

    *pPPI_FRAME   = 960;          
    *pPPI_COUNT   = 1279;    //640*960    
    *pPPI_DELAY   = 0;    
    *pPPI_CONTROL = 0x01AC;      //POLS POLC all 0
      
    *pDMA0_START_ADDR = databuf;    
    *pDMA0_X_COUNT    = 640;
    *pDMA0_X_MODIFY   = 0x1;            
    *pDMA0_Y_COUNT    = 960;    
    *pDMA0_Y_MODIFY   = 0x1;                                                    
    *pDMA0_PERIPHERAL_MAP = 0x0;
    *pDMA0_CONFIG         =  WNR | WDSIZE_8| DMA2D | DI_EN;   //WDSIZE_16
    *pDMA0_CONFIG        |= DMAEN;
    ssync();
    *pPPI_CONTROL        |= PORT_EN;
    ssync();
              
}

打印databuf出来的图像是960*1279的,databuf我设置的也是640*960的大小,不明白为什么,还是采集过程不可以这样设置?




「该帖子被 unconscious 在 2013-11-12 09:55:13 编辑过」

^_^
等级:论坛新手 参考IP地址:*.*.*.*
2013/10/25 11:20:44
15
1
1/2
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159320 Call, 1 Queries, Processed in 0.031250 second(s),