返回列表 回复 发帖

利用freescale单片机进行电子产品设计

欢迎有用freescale单片机即MOTOROLA单片机的朋友参与到这个讨论专题里来,我相信我可以为大家解决一些设计方面的技术问题.

freescale单片机的开发环境

  freescale单片机的开发环境: CodeWarrior,可以到飞思卡尔的网站去下载:www.freescale.com

请教一个freescale单片机的问题:

我用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);
}
}
返回列表