我用mc9s12dg128对SAA7113进行初始化,但是从机不产生应答信号,请问这是什么原因了,软件的问题吗?
我的原程序也是从网站上参考的。请帮忙看看。
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#define uint unsigned int
#define uchar unsigned char
#define WRITE 0x48 /*写器件地址 */
#define READ 0x49 /*读器件地址 */
void init_system()
{
//DisableInterrupts;
DDRB=0xff;
DDRA=0xff;
DDRT_DDRT2=0;
DDRT_DDRT4=0;
DDRT_DDRT5=0;
DDRM=0x00;
//EnableInterrupts;
}
void init_I2C(void)
{
IBFD=0x54; /* frequency divider register,bus=16mHz=>SCL=182kHz */
IBAD =0x00; /* slave address of this module */
IBCR =0x80; /* enable Iic module and Nointertupts */
IBSR_IBAL=1; //clear the IBAL flag;
}
void write_byte(uchar w_add,uchar w_data)
{
while(IBSR_IBB==1)
{;}
IBCR_TXAK=0; //TXAK=0;
IBCR|=0x30; //rx/tx=1;ms/sl=1;txak=0;and generate START condition
IBDR=WRITE; //slave address
while(!IBSR_IBIF);
IBSR_IBIF=1; //clear the interrupt event flag;
while(IBSR_RXAK); //check for RXAK;
IBDR=w_add;
while(!IBSR_IBIF);
IBSR_IBIF=1; //clear the interrupt event flag;
while(IBSR_RXAK); //check for RXAK;
IBDR=w_data;
while(!IBSR_IBIF);
IBSR_IBIF=1; //clear the interrupt event flag;
while(IBSR_RXAK); //check for RXAK;
IBCR_MS_SL=0; //generate STOP condition;
}
void read_byte(uchar r_add)
{
uchar RD_data;
IBCR_TXAK=0;
IBCR|=0x30;
IBDR=WRITE; //slave write;
while(!IBSR_IBIF);
IBSR_IBIF=1; //clear the interrupt event flag;
while(IBSR_RXAK);//check for RXAK;
IBDR=r_add;
while(!IBSR_IBIF);
IBSR_IBIF=1; //clear the interrupt event flag;
while(IBSR_RXAK);//check for RXAK;
IBCR_RSTA=1;
IBDR=READ; //slave read
while(!IBSR_IBIF);
IBSR_IBIF=1; //clear the interrupt event flag;
while(IBSR_RXAK);//check for RXAK;
IBCR_TX_RX=0; //set up to receive;
IBCR_TXAK=1; //Ackowledge disable;
RD_data=IBDR; //dummy read;
while(!IBSR_IBIF);
IBSR_IBIF=1;
IBCR_MS_SL=0; // generate stop signal;
RD_data=IBDR; //read right data;
PORTB=RD_data;
}
void main(void)
{
init_system();
init_I2C() ;
write_byte(0x01,0x08);
while(1)
{
read_byte(0x01);
}
} |