HCS08的IIC模块读写24C02实验
0赞1、实验功能介绍
标准的iic接口的EEPROM芯片,可以实现iic主从通讯,向24C02写6个字节并读出。做本实验时需将拨码开关 “SW28”的所有位拨到“ON”位置。
2、流程图
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++;
}
}