标题: 【新人求助】IAP15W4K58S4与DAC7571不能通信 [打印本页]

作者: 吕小布361    时间: 2016-3-1 13:30
标题: 【新人求助】IAP15W4K58S4与DAC7571不能通信
#include        "STC15W4K.H"

#define     MAIN_Fosc      24000000L   //定义主时钟

#define uchar unsigned char
#define uint  unsigned int

#define SCL_1                P41=1
#define SCL_0                P41=0
#define SDA_1                P42=1
#define SDA_0                P42=0
//#define RESET_1                P43=1
//#define RESET_0         P43=0                //Active_low reset input


#define SDA_val                                (P4 & 0x04)

//#define delay_time                60
#define FALSE                        0
#define TRUE                        1

void  delay_us(uint us);
void DAC7571_PORT_Init(void);
void I2C_Start(void);
void I2C_Stop(void);
void Send_1(void);
void Send_0(void);
uchar Check_Acknowledge(void);
void Send_Acknowledge(void);
void Send_NAcknowledge(void);
void WriteI2CByte(uchar dat);
uchar ReadI2CByte(void);
void Write_One_Byte(uchar Slave_addr,uchar Command_Byte,uchar reg1_data);
uint Read_One_Byte(uchar Slave_addr);//,uchar Command_Byte);

void main(void)
{
        uint dat;
       
        P0M1 = 0;   P0M0 = 0;   //设置为准双向口
    P1M1 = 0;   P1M0 = 0;   //设置为准双向口
    P2M1 = 0;   P2M0 = 0;   //设置为准双向口
    P3M1 = 0;   P3M0 = 0;   //设置为准双向口
    P4M1 = 0;   P4M0 = 0;   //设置为准双向口
    P5M1 = 0;   P5M0 = 0;   //设置为准双向口
    P6M1 = 0;   P6M0 = 0;   //设置为准双向口
    P7M1 = 0;   P7M0 = 0;  //设置为准双向口
                                                  
        DAC7571_PORT_Init();
        while(1)
        {
                Write_One_Byte(0x9A,0x0c,0x1f);     
                delay_us(150);
               
                dat = Read_One_Byte(0x9A);               
                //if(dat)
                //{
                        //P32=0;
                //}
        }
}

/*
* 函数名:Write_One_Byte()
* 输入:Slave_addr:从设备地址,最后一位是R/W控制位
*            Command_Byte:控制命令,选择要写的寄存器地址
*            reg1_data:Command_Byte寄存器的数据
*            reg2_data:与Command_Byte寄存器配对寄存器的数据
* 输出:无
*
*/
void Write_One_Byte(uchar Slave_addr,uchar Command_Byte,uchar reg1_data)
{
        I2C_Start();
        WriteI2CByte(Slave_addr);
        if(Check_Acknowledge())
                WriteI2CByte(Command_Byte);
        if(Check_Acknowledge())
                WriteI2CByte(reg1_data);
                I2C_Stop();
}

uint Read_One_Byte(uchar Slave_addr)//,uchar Command_Byte)
{
        uint temp,dat;
        I2C_Start();
        WriteI2CByte(Slave_addr);
        if(Check_Acknowledge())
        //WriteI2CByte(Command_Byte);

        //if(Check_Acknowledge())
        I2C_Start();

        WriteI2CByte(Slave_addr+1);
        if(Check_Acknowledge())
        temp = ReadI2CByte();
//        temp <<= 8;
        Send_Acknowledge();
//        temp = temp | ReadI2CByte();
        dat = ReadI2CByte();  //这个对应的寄存器的值不需要,是由线路板硬件决定的

        Send_NAcknowledge();
        I2C_Stop();
        return temp;
}

void DAC7571_PORT_Init(void)                        /*引脚初始化*/
{
    SCL_1;
        SDA_1;
}

void I2C_Start(void)  /*启动I2C总线的函数,当SCL为高电平时使SDA产出一个负跳变*/
{
        SDA_1;
        SCL_1;
        delay_us(5);
        SDA_0;
    delay_us(5);
        SCL_0;
        delay_us(5);
}

void I2C_Stop(void)                /*终止I2C总线的函数,当SCL为高电平时使SDA产出一个正跳变*/
{
        SDA_0;
        SCL_1;
        delay_us(5);
        SDA_1;
        delay_us(5);
        SCL_0;
        delay_us(5);
}

void Send_1(void)                /*发送1,在SCL为高电平时使SDA信号为高*/
{
        SDA_1;
        delay_us(5);
        SCL_1;
        delay_us(5);
        SCL_0;
        delay_us(5);
}

void Send_0(void)                /*发送0,在SCL为高电平时使SDA信号为低*/
{
        SDA_0;
        delay_us(5);
        SCL_1;
        delay_us(5);
        SCL_0;
        delay_us(5);
}

uchar Check_Acknowledge(void)                /*检查从设备的应答信号*/
{
        uchar temp;
        SCL_1;
        //SDA_input;
        delay_us(2);
        SCL_1;
        temp = SDA_val;
        delay_us(2);
        SCL_0;
        delay_us(5);
        //SDA_output;
        if(temp)
                return FALSE;
        return TRUE;
}

void Send_Acknowledge(void)                        /*主机应答操作*/
{
        SDA_0;
        delay_us(5);
        SCL_1;
        delay_us(5);
        SCL_0;
        delay_us(5);
        SDA_1;
        delay_us(5);
}
void Send_NAcknowledge(void)                        /*主机无应答操作*/
{
        SDA_1;
        delay_us(5);
        SCL_1;
        delay_us(5);
        SCL_0;
    delay_us(5);
        SDA_0;
        delay_us(5);
}

void WriteI2CByte(uchar wdata)                /*向I2C总线写一个字节*/
{
        uchar i;
        //SDA_output;
        for(i=8;i>0;i--)
        {
                if(wdata & 0x80)
                        Send_1();
                else
                        Send_0();
                wdata <<=1;
       
        }
}
uchar ReadI2CByte(void)                        /*向I2C总线读一个字节*/
{
        uchar result=0,i;
        //SDA_input;
        for(i=8;i>0;i--)
        {
                SCL_1;
                delay_us(5);
                SCL_0;
                result <<= 1;
                if(SDA_val)
                        result |= 0x01;
        //        result=result+1;
        }
        //SDA_output;
        return result;
}
//========================================================================
// 函数:void  delay_us(u16 us)
// 描述: 延时函数。
// 参数: 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期:
// 备注:
//========================================================================
void  delay_us(uint us)
{
     uint i;
     do{
          i = MAIN_Fosc / 13000000;
          while(--i)    ;   //14T per loop
     }while(--us);
}


作者: 吕小布361    时间: 2016-3-1 13:36
C:\Documents and Settings\Administrator\桌面\tp    要DAC7571输出2.5v,麻烦大家帮我看看程序哪里不对,可以有偿服务,谢谢!
作者: 吕小布361    时间: 2016-3-1 13:50
要dac输出2.5v,求助大家了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1