2722|1

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助:NiosII的模拟I2C控制没有应答 [复制链接]

使用NiosII控制高频头CU1216,在NiosII IDE中运行下列程序后,由于没有应答,程序死在Write_I2C_Byte函数的while(I2C_Ackn() );,reset,sda,scl均加了上拉电阻,进行了一些检查均没有结果 ,哪位高手能帮我指点迷津?谢谢。
#include "i2c.h"
#include "system.h"
#include
#include

//*******************************************//
//***DELAY FUNCTION//
//*******************************************//


void delay(unsigned int dt)
{
while(dt>0)
   {
   asm("nop");
   dt--;
   asm("nop");
   }

}

//*********************************************//
//***  This routine will reset the I2C bus ***//
//********************************************//
void Reset_I2C(void)
{
    IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_RESET_BASE, 1);  // Set RESET to output
    IOWR_ALTERA_AVALON_PIO_DATA(I2C_RESET_BASE, 1);   // Set RESET high
    delay(I2C_TIMER);
    IOWR_ALTERA_AVALON_PIO_DATA(I2C_RESET_BASE, 0);   // Set RESET low
    delay(I2C_TIMER);
    delay(I2C_TIMER);
    delay(I2C_TIMER);
    delay(I2C_TIMER);
    delay(I2C_TIMER);
    delay(I2C_TIMER);
    delay(I2C_TIMER);
    IOWR_ALTERA_AVALON_PIO_DATA(I2C_RESET_BASE, 1);   // Set RESET high
    delay(I2C_TIMER1);
}   

// ******************************************** //
// *** This routine will setup the I2C Port *** //
// ******************************************** //


void Init_I2C(void)
{          //1 ??
IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_SCL_BASE, 1);  // Set SCL to output  
IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_SDA_BASE, 1);   // Set SDA to output
  
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 1);    // Set SCL high
delay(I2C_TIMER);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 1);  // Set SDA high
delay(I2C_TIMER);
}

// ************************************************ //
// *** This routine will send the I2C Start Bit *** //
// ************************************************ //

void I2C_Start (void)
{
  delay(I2C_TIMER/2);
  IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 1);     // Set SCL High
  delay(I2C_TIMER);
  IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 1);      // Set SDA High
  delay(I2C_TIMER);
  IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_SDA_BASE, 1);        // Set SDA to output
  IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 0);       // Clear SDA
  delay(I2C_TIMER);
  IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 1);     // Set SCL high
  delay(I2C_TIMER);
}

//*********************************************** //
// *** This routine will send the I2C Stop Bit *** //
// *********************************************** //

void I2C_Stop (void)
{

IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_SDA_BASE, 1);         // Set SDA to output
  
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 0);      // Clear SDA
delay(I2C_TIMER*2);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 0);      // Clear SCL
delay(I2C_TIMER*2);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 1);        // Set SCL High
delay(I2C_TIMER*4);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 1);       // Set SDA High
delay(I2C_TIMER*2);
}

// ******************************************************** //
// *** This routine will write a byte to the I2C device *** //
// ******************************************************** //

void Write_I2C_Byte(unsigned char byte)
{
unsigned int i;

IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_SDA_BASE, 1);           // Set SDA to output
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 0);
delay(I2C_TIMER);
for (i = 0; i < 8; i++){      // Loop for our 8 bits

   if((byte & 0x80) == 0x80) IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 1); // Set I2C SDA PIN
   else IOWR_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE, 0);              // Clear I2C SDA PIN
   delay(I2C_TIMER);
   IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 1);        // Set SCL High, Clock data
   delay(I2C_TIMER);
   byte = byte << 1;           // Shift data in buffer right one
  
    IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 0);       // Clear SCL
    delay(I2C_TIMER);
  
  }
while(I2C_Ackn() );           // Check for acknowledge from I2C device

}

unsigned char I2C_Ackn(void)
{
unsigned char Ackn = 0;       // Temp RAM for Ackn flag
   delay(I2C_TIMER/2);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 0);     //  CLEARBIT(I2C_PORT,SCL);
   delay(I2C_TIMER);
IOWR_ALTERA_AVALON_PIO_DIRECTION(I2C_SDA_BASE, 0);    // Set SDA to input
   delay(I2C_TIMER);
IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 1);    //SETBIT(I2C_PORT,SCL);         // Clock the ACK bit
   delay(I2C_TIMER/2);

if ((IORD_ALTERA_AVALON_PIO_DATA(I2C_SDA_BASE)&0x01)==0x01) Ackn = 1;   // Check the ACK bit on SDA
delay(I2C_TIMER);
//IOWR_ALTERA_AVALON_PIO_DATA(I2C_SCL_BASE, 0);      //CLEARBIT(I2C_PORT ,SCL);         // Clear the clock

return Ackn;            // Return our ACK bit
}
//***********************************//
//***This routine is main fuction***//
//**********************************//
void  main()
{
Reset_I2C();
Init_I2C();            //初始化I2C总线
I2C_Start();           //I2C总线的起始条件
Write_I2C_Byte(0xC0);  //写入控制字ADB,b11000000
Write_I2C_Byte(0x1B);  //写入控制字DB1,b00011011
Write_I2C_Byte(0xF2);  //写入控制字DB2,b11110010
Write_I2C_Byte(0xCE);  //写入控制字CB,b11001110
Write_I2C_Byte(0x04);  //写入控制字BB,b00000100
I2C_Stop ();           //I2C总线的结束条件
}

最新回复

程序看似没有问题。 建议你再看看从设备的文档看硬件配置是否正确,然后拿示波器看看波形和预期的是否一致。 供参考.   详情 回复 发表于 2008-8-5 16:55
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
程序看似没有问题。 建议你再看看从设备的文档看硬件配置是否正确,然后拿示波器看看波形和预期的是否一致。 供参考.
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:ADMT4000 掀起多圈编码器设计革命 报名中!
直播时间:5月8日(周四)上午10:00
直播主题:ADMT4000 掀起多圈编码器设计革命
预报从速,好礼等您拿~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 2

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表