找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2891|回复: 2
打印 上一主题 下一主题
收起左侧

【新人求助】IAP15W4K58S4与DAC7571不能通信

[复制链接]
跳转到指定楼层
楼主
ID:99515 发表于 2016-3-1 13:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2黑币
#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);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:99515 发表于 2016-3-1 13:36 | 只看该作者
C:\Documents and Settings\Administrator\桌面\tp    要DAC7571输出2.5v,麻烦大家帮我看看程序哪里不对,可以有偿服务,谢谢!
回复

使用道具 举报

板凳
ID:99515 发表于 2016-3-1 13:50 | 只看该作者
要dac输出2.5v,求助大家了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表