freetech

HCS08的IIC模块读写24C02实验

0
阅读(2292)

1、实验功能介绍

标准的iic接口的EEPROM芯片,可以实现iic主从通讯,向24C02写6个字节并读出。做本实验时需将拨码开关 “SW28”的所有位拨到“ON”位置。

2、流程图

clip_image002

3、实验现象

3、1将IIC_24C02实验程序下载到学习板中,观察读出缓冲区的变化。

4、程序代码:

//main.c

/*****************头文件*****************************************/
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "EEPROM.h"

/*********************变量和函数定义****************************/
byte READ_buff[8]={0,0,0,0,0,0,0,13};
byte WRITE_buff[7]={0x01,0x02,0x03,0x04,0x05,0x06,0x07};

void MCU_INIT(void);
void ICS_INIT(void);
void delay(void);

/*********************主函数************************************/
void main(void) {
    EnableInterrupts; /* enable interrupts */
    /* include your code here */
    MCU_INIT();
    ICS_INIT();
    Init_IIC();
    EEP_Write(0x02,WRITE_buff,6);
    delay();
    EEP_Read(0x02,READ_buff,6);
    for(;;) {

        __RESET_WATCHDOG(); /* feeds the dog */
    } /* loop forever */
      /* please make sure that you never leave main */
}

/***************************MCU初始化函数*******************************/
void MCU_INIT(void){

    SOPT1=0x42; //关看门狗,BKGD使能
    SOPT2=0x00;

}

/***************************ICS初始化函数*******************************/
void ICS_INIT(void) {

    MCGC1=0x04; //选择内部时钟
    MCGC2=0x40; //时钟源二分频
    //ICSTRM=0xa8;//内部时钟微调

}

/*********************延时函数************************************/

void delay(void)

{
      byte i;
      i=200;
      while(i>0)
      {
            i--;
      }
}

 

 

//I2C.C

/*****************头文件*****************************************/
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */

static void delay(void)

{
      byte i;
      i=200;
      while(i>0)
      {
            i--;
      }

/*********************ICC初始化************************************/

void Init_IIC(void)
{
      IICF=0x0d;   //设置波特率<100kbps
      IICC1_IICEN=1;//使能IIC
      IICC1_TXAK=0; //当接收完一字节数据产生确认位
      IICC1_IICIE=0;//禁止中断
    IICA=0x38;
}

void Start_IIC(){
    byte temp;
      IICC1_IICEN = 0;
    IICC1_IICEN = 1;    //使能IIC
    temp = IICS;       //清中断  
    IICS_IICIF = 1;
    IICC1_MST=0;
    IICS_SRW=0;
      IICC1_TX=1;         //写使能
      IICC1_MST=1;        //设为主模式
      delay();

}
void Restart_IIC(){
      IICC1_TXAK=1;
    IICC1_RSTA=1;     //重新启动
}

void Stop_IIC(){
      IICC1_TX=0;
    IICS_SRW=0;
    IICC1_MST=0;
}
void IIC_Write_Byte(byte dat){
    byte temp;
  IICD=dat;
  while(!IICS_IICIF);
  temp = IICS; 
    IICS_IICIF=1; 
}

/*********************读一个字节************************************/
byte IIC_read_byte(){
      byte temp;   
    while(!IICS_IICIF);
    temp = IICS; 
      IICS_IICIF=1;
      temp=IICD;       //读一个字节
      return(temp);

}

 

//EEprom.c

#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */

#include "I2C.h"
#include "EEPROM.h"
/*********************写函数************************************/

void EEP_Write(byte SubAddr , byte* buf , byte len)
{
      byte cnt;
      Start_IIC();
      IIC_Write_Byte(0xA0);//发送芯片地址,写命令
      IIC_Write_Byte(0x02);//发送寄存器地址
      for( cnt=0 ; cnt<len ; cnt++ ){
        IIC_Write_Byte(*buf);
      buf++;
      }
      Stop_IIC();
}

byte EEP_read_one_byte(byte address)
{
      byte temp;
    Start_IIC();
      IIC_Write_Byte(0xA0);

      IIC_Write_Byte(address);//发送寄存器地址   
    Restart_IIC();//重新启动
      IIC_Write_Byte(0xA1);//读命令
      IICC1_TX=0;       //读使能
      temp=IICD;
      temp = IIC_read_byte();
      Stop_IIC();
      return temp;   

/*********************读函数************************************/

void EEP_Read(byte SubAddr ,byte* buf , byte len)
{
  byte cnt;
  for(cnt=0 ; cnt<len ; cnt++) {
    *buf = EEP_read_one_byte(SubAddr);
    buf++;
    SubAddr++;
  }
}