首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

9S12的IIC程序调不通,高手帮忙看下吧!

9S12的IIC程序调不通,高手帮忙看下吧!

#include <hidef.h>      /* common defines and macros */
#include <mc9s12dp512.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dp512"
  ///////////////
  // IIC  部分 //
  ///////////////
void IIC_int()                      /* IIC初始化 */
{
  IBFD=0x2b;                        /* 设置时钟为总线频率512分频 */
  IBCR|=0x80;                       /* 使能IIC */         
}
void IIC_Start1()                   /* 起始条件 */
{
  IBCR|=0x30;
}
void IIC_Start2()                   /* 起始条件 */
{
  IBCR|=0x00;
}
void IIC_Stop()                     /* 停止条件 */
{
  IBCR&=0xdf;                       /* 停止 */
}
void delay(unsigned long m)         /* 延时 */
{
  while(m--);
}
unsigned char IIC_send_data(unsigned char ch)       /* IIC发送程序 */
{
  IBSR_IBIF=1;                      /* 清除标志位 */
  IBDR=ch;
  while(!IBSR_IBIF);                 /* 等待响应 */
}
void wait_ack()                     /* 应答等待程序 */
{
  while(IBSR_RXAK);
}

// PLL //
void Set_PLL(void)               //初始化PLL子程序,总线时钟为PLL的2分频
{
   
   SYNR=0x02;
   REFDV=0x01;
   while (!(CRGFLG & 0x08));     //等待时钟频率已稳定锁相环频率已锁定
   CLKSEL_PLLSEL=1;              //选定所相环时钟
}
  //////////////////
  // PCF8563 部分 //
  //////////////////
unsigned char P8563_Read_Time();
unsigned char P8563_Set_Time();
extern struct Time time;                   /* 用于装载时间数据的结构体型的变量time */
struct Time                         /* 时间结构体,包括了秒,分,时,日,周,月,年 */
{
unsigned char second;
unsigned char minute;
unsigned char hour;
unsigned char day;
unsigned char week;
unsigned char month;
unsigned char year;
};

unsigned char PCF8563_Write_Bytes(unsigned char addr,unsigned char length,unsigned char *pbuf)
{
unsigned char i=0;
IIC_Start1();                      /*IIC通信开始 */
if(IIC_send_data(0xa2)) return 1;  /*写PCF8563的ID与读写控制位,通信有错误立即返回 */
if(IIC_send_data(addr)) return 1;  /*写寄存器地址 */
for(i=0;i<length;i++)              /* 写入length个字节 */
{
  if(IIC_send_data(pbuf[i])) return 1;/*写数据 */
}
IIC_Stop();
return 0;
}

unsigned char PCF8563_Read_Bytes(unsigned char addr,unsigned char length,unsigned char *pbuf) /*从地址addr连续读取length个字节到pbuf */
{
unsigned char i=0,err=0;
IIC_Start1();                      /* IIC通信开始 */
if(IIC_send_data(0xa2)) return 1;  /* 写PCF8563的ID与读写控制位,通信有错误立即返回 */
if(IIC_send_data(addr)) return 1;  /* 写寄存器地址 */
IIC_Start2();                       /* IIC通信开始 */
if(IIC_send_data(0xa3)) return 1;  /* 写PCF8563的ID与读写控制位 */
for(i=0;i<length-1;i++)            /* 写入前length-1个字节,并作出应答 */
{
  pbuf[i]=IIC_send_data(addr);      /* 读数据 */
  while(IBSR_RXAK);
}
pbuf[i]=IIC_send_data(addr);       /*写入最后一个字节,并作出无应答 */
while(!IBSR_RXAK);
IIC_Stop();
return 0;
}

unsigned char BCD2Val(unsigned char x)
{
return (x>>4)*10+(x&0x0f);         /* 高4位乘以10,再加上低4位,即得到数值 */
}

unsigned char Val2BCD(unsigned char x)
{
return (x/10)*16+(x%10);           /* 将十进制的数值十位乘以16,再加上个位,即得到BCD码 */
}

unsigned char P8563_Read_Time()      
{
unsigned char temp[7];
if(!PCF8563_Read_Bytes(0x02,7,temp)) /* 读取时间,即读取PCF8563的时间寄存器,地址从0x02开始 */
{
  /* 以下对读取到temp数组中的时间数据进行截取 */
  /* 并转换为十进制数值写入到time中去 */
  time.second=BCD2Val(temp[0]&0x7f); //秒
  time.minute=BCD2Val(temp[1]&0x7f); //分
  time.hour  =BCD2Val(temp[2]&0x3f); //小时
  time.day   =BCD2Val(temp[3]&0x3f); //日
  time.week  =BCD2Val(temp[4]&0x07); //星期
  time.month =BCD2Val(temp[5]&0x1f); //月
  time.year  =BCD2Val(temp[6]     ); //年
  return 0;
}
else
return 1;
}

unsigned char P8563_Set_Time()
{
unsigned char temp[7];
unsigned char i;
for(i=0;i<7;i++)
{
  temp[i]=Val2BCD(((unsigned char *)(&time))[i]);/* 将time中的时间数据转换为BCD格式,并写入到temp数组中 */
}
return PCF8563_Write_Bytes(0x02,7,temp); /* 将temp数组的数据写入到PCF8563中 */
}

   ////////////
   // 主程序 //
   ////////////
void main()
{IIC_int();
EnableInterrupts;
Set_PLL;
P8563_Set_Time();                        /* 设置时间,即将time中的时间数据写入PCF8563 */
time.year  =10;                          /* 向time中装入要设置的时间数据 */
time.month = 5;
time.day   =16;
time.hour  =10;
time.minute=25;
time.second=50;
time.week  = 7;

   
while(1)                                 /* 循环 */
{
  P8563_Read_Time();                      /* 读取时间 */
  delay(60000);                           /* 延时一段时间 */
}
while(1);
}
学习学习。。。。。
我也看了一下,没有发现什么问题,你出现的问题是不是IIC一直在等待啊!我也想知道为什么?
好像IIC_Start2有点问题
IBM T42:PM735/1.5GB(333)/160GB/R9600M(64MB)VAIO FW94:T9900/8GB(800)/500GB/HD4650(1GB)VAIO F11:i7 820QM/6GB(1333)/500GB/GT330M(1GB)VAIO Y21:i3 330UM/4GB(800)/320GB/IntelHD(128MB)
以下是引用第2楼热带语翎(常州)的话:哎,头晕死了,下线睡觉有些事娱乐娱乐就行了,不能当真.
返回列表