打印

IIC配置AD5242时,发送数据后,AD5242无应答信号

[复制链接]
3726|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
图为产生的SCL与SDA的时序关系,可以看出第SCL的9个脉冲时,SDA仍为高,及无应答信号
iic的程序以前配置过DS1307日历芯片,是成功了的。

求大师指教一下!

iic.JPG (42.74 KB )

iic.JPG

相关帖子

沙发
GoldSunMonkey| | 2012-9-3 22:05 | 只看该作者
感觉AD无应答,是不是AD虚焊或者其他什么原因。

使用特权

评论回复
板凳
Backkom80| | 2012-9-4 13:18 | 只看该作者
scl频率是多少?

使用特权

评论回复
地板
Backkom80| | 2012-9-4 13:20 | 只看该作者
我看了这两个芯片的datasheet
时序上是有些区别的,

使用特权

评论回复
5
Backkom80| | 2012-9-4 13:21 | 只看该作者
单从波形上看是好像一样,但在一些参数的细节上有一些不同

使用特权

评论回复
6
ailsacqx|  楼主 | 2012-9-4 20:24 | 只看该作者
5# Backkom80
有什么区别,我觉得时序上没什么问题呀,求指点!

使用特权

评论回复
7
ailsacqx|  楼主 | 2012-9-4 20:25 | 只看该作者
3# Backkom80
iic是用IO口模拟的,延时10us左右,频率应该在100khz以内

使用特权

评论回复
8
ailsacqx|  楼主 | 2012-9-4 20:29 | 只看该作者
6# ailsacqx
iic的程序应该是一样的,就是配置AD的参数和过程不一样,但我是按AD的手册里的时序描述配置的,感觉没什么问题

使用特权

评论回复
9
GoldSunMonkey| | 2012-9-4 20:44 | 只看该作者
我觉得问题不在FPGA侧

使用特权

评论回复
10
ailsacqx|  楼主 | 2012-9-4 21:30 | 只看该作者
9# GoldSunMonkey

使用特权

评论回复
11
ailsacqx|  楼主 | 2012-9-4 21:31 | 只看该作者
9# GoldSunMonkey
但是我用万用表打了一下,虚焊应该是不存在的

使用特权

评论回复
12
Backkom80| | 2012-9-4 23:07 | 只看该作者
嘻嘻,看看Data Hold Time这个值,我猜可能是这有问题。

使用特权

评论回复
13
Backkom80| | 2012-9-4 23:12 | 只看该作者
这是时序,注意t6

无标题.jpg (61.13 KB )

无标题.jpg

无标题1.jpg (130.37 KB )

无标题1.jpg

使用特权

评论回复
14
shixiaowei7758| | 2012-9-5 09:11 | 只看该作者
首先是器件没有应答,我感觉需要采取两步来判断问题:1.确定器件的IIC地址设置正确,你的IIC地址是什么?地址的设置跟AD1和AD0两个管脚有关系吧?2.用示波器实测一下波形看看是不是跟自己写的时序一致?

使用特权

评论回复
15
ailsacqx|  楼主 | 2012-9-5 09:26 | 只看该作者
14# shixiaowei7758
这是我的代码,你可以帮我看哈

#define  dly1  10
#define  dly2  5
/********************************
* 函数名称: start()
* 函数功能: I2C启动
* 输入参数: 无
* 返回值  : 无
*******************************/
static void start(void)   
{
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT);
IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 1);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(dly1);
IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0);
usleep(dly2);
}
/************************
* 函数名称: stop()
* 函数功能: I2C停止
* 输入参数: 无
* 返回值  : 无
*********************/
static void stop(void)     
{
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT);
IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
usleep(dly1);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(dly2);
IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 1);
usleep(dly1);
}

/************************
* 函数名称: ack()
* 函数功能: I2C应答
* 输入参数: 无
* 返回值  : 无
*********************/
static void ack(void)     
{
alt_u8 tmp;
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, IN);
usleep(dly1);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(dly2);
tmp = IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE);
usleep(dly2);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
usleep(dly1);
}

/************************
* 函数名称: iic_write()
* 函数功能: I2C写一个字节的数据
* 输入参数: dat
* 返回值  : 无
*********************/
void iic_write(alt_u8 dat)   
{
alt_u8 i, tmp;
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT);
for(i=0; i<8; i++){
  IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
  usleep(dly2);
  tmp = (dat & 0x80) ? 1 : 0;
  dat <<= 1;
  IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, tmp);
  usleep(dly2);
  IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
  usleep(dly1);
}
//    IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 1);
//    IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
//    usleep(dly2);
}
/************************
* 函数名称: iic_read()
* 函数功能: I2C读取一个字节的数据
* 输入参数: 无
* 返回值  : dat(即读取到的数据)
*********************/
static alt_u8 iic_read(void)   
{
alt_u8 i, dat = 0;
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, IN);
for(i=0; i<8; i++){
  IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
  usleep(dly1);
  IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
  usleep(dly2);
  dat <<= 1;
  dat |= IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE);
  usleep(dly2);
}
usleep(5);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
usleep(dly1);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1);
usleep(dly1);
IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0);
return dat;
}

/************************
* 函数名称: write_byte()
* 函数功能: 向AD5242写一个字节数据dat
* 输入参数: alt_u8 dat
* 返回值  : 无
************************/
static void write_byte(alt_u8 dat)
{
alt_u8 cmdwrite;
    alt_u8 instruction;
   
cmdwrite=0x58;//器件地址AD0=0;AD1=0;而硬件的这两个管脚都接地
instruction=0x00;
start();
iic_write(cmdwrite);
ack();
iic_write(instruction);
ack();
iic_write(dat);
ack();
stop();   
}

  /************************
* 函数名称: read_byte()
* 函数功能: 从AD5242的addr地址读取一个字节数据
* 输入参数: 无
* 返回值  : alt_u8 dat
***********************/
static alt_u8 read_byte(void)
{
alt_u8 cmdread,dat;
cmdread= 0x59;
start();
iic_write(cmdread);
ack();
dat = iic_read();
stop();   
return dat;
}

使用特权

评论回复
16
Backkom80| | 2012-9-5 10:09 | 只看该作者
你是用nios做的?
你这怎么能保证你给的IIC时序符号AD5242上面时序参数的要求。从t1-t10这些时序参数符不符合你清楚不?

使用特权

评论回复
17
ailsacqx|  楼主 | 2012-9-5 10:24 | 只看该作者
16# Backkom80
嗯,以前配置DS1307也是用的上面的iic程序,只是在读写器件的函数不一样。
从我用signalTap打出了的波形看,时序没多大问题,就是器件无应答呀!
刚刚为了使t6不超过最大,在iic_write()函数中吧第一个usleep去掉了,可是还是不行!

使用特权

评论回复
18
Backkom80| | 2012-9-6 08:19 | 只看该作者
t1到t10的所有参数者满足时序的要求?
用示波器在物理线路上在看看

使用特权

评论回复
评分
参与人数 1威望 +10 收起 理由
GoldSunMonkey + 10 谢谢分享
19
ailsacqx|  楼主 | 2012-9-6 09:54 | 只看该作者
换了个芯片,可以正常读写了。应该是之前的芯片坏了。。
特别感谢楼上的亲!希望以后还可以多多交流

使用特权

评论回复
20
Backkom80| | 2012-9-7 17:20 | 只看该作者
呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

13

帖子

1

粉丝