[资料分享] msp430f5529 MCP4725程序

灞波儿奔   2019-10-8 22:17 楼主

//**************************************
//I2C起始信号
//**************************************
void I2C_Start()
{
    SDAOUT;                  //数据线设为输出方向
    SDA1;                    //拉高数据线
    SCL_OUT;                 //时钟线设为输出方向
    SCL1;                    //拉高时钟线
    delayus(5);                 //延时
    SDA0;                    //产生下降沿
    delayus(5);                  //延时
    SCL0;                    //拉低时钟线
}
//**************************************
//I2C停止信号
//**************************************
void I2C_Stop()
{
    SCL0;                    //拉低时钟线,才可以改变数据
    delayus(5);                  //延时
    SDAOUT;                  //SDA设为输出方向
    SDA0;                    //拉低数据线
    SCL1;                    //拉高时钟线
    delayus(5);                   //延时
    SDA1;                    //产生上升沿
    delayus(5);                  //延时
}
//**************************************
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK(uchar ack)
{
    SDAOUT;                   //SDA设为输出方向
    SCL0;                   //拉低时钟线后才可以改变数据
    if(ack) SDA1;
       else SDA0;
//    SDA = ack;                 //写应答信号
    SCL1;                    //拉高时钟线
    delayus(5);                  //延时
    SCL0;                    //拉低时钟线
    delayus(5);                  //延时
}
//**************************************
//I2C接收应答信号
//cy=1,从机发送出的是NACK信号。
//cy=0,从机发送出的是ACK信号。
//**************************************
uchar I2C_RecvACK()
{
    uchar cy;
    SCL0;//时钟线拉低,等待变为上升沿取数据
    SCL1;                    //拉高时钟线,开始读取数据
    SDAIN;                   //将SDA设为输入方向
    delayus(5);                 //延时
    if(SDADATA)//接受到NACK信号,发送停止信号
    {
        cy=1;
    }
    else
    {
        cy=0;
    }
    SCL0;                    //拉低时钟线,读取完毕
    delayus(5);                //延时
    SDAOUT;                  //SDA设为输出方向
    return cy;

}
//**************************************
//向I2C总线发送一个字节数据(写数据)
//**************************************
void I2C_SendByte(uchar dat)
{
    uchar i;
    SCL0;//拉低时钟线,才能改变数据。
    for (i=0; i<8; i++)
    {
        if((dat<<i)&0x80)//读取最高位的数据,如果最高位为1,则置1,否则置零
        {
            SDA1;
        }
        else
        {
            SDA0;
        }
        SCL1;                //拉高时钟线,稳定数据
        delayus(5);              //延时
        SCL0;                //拉低时钟线,准备再次改变数据
        delayus(5);              //延时
    }
    I2C_RecvACK();
}
//**************************************
//从I2C总线接收一个字节数据
//**************************************
uchar I2C_RecvByte()
{
    uchar i;
    uchar dat = 0,cy;
    SDAIN;
    SCL0;//时钟线拉低,允许数据改变
    for (i=0; i<8; i++)
    {
        dat <<= 1;           //从最低位开始接收数据
        SCL1;                //拉高时钟线,读取数据,不允许数据发生变化
        delayus(5);             //延时
        if(SDADATA)
        {
            cy=1;
        }
        else
        {
            cy=0;
        }
        dat |= cy;             //读数据
        SCL0;                //拉低时钟线,允许数据变化
        delayus(5);             //延时
    }
    SDAOUT;
    return dat;
}
//MCP4725
//使用快速模式写命令写DAC寄存器
void MCP4725_WriteData_Voltage(float Vout)   //电压单位V
{
    unsigned char temp;
    unsigned int Dn;
    Dn = ( 4096 * Vout)/5;
    temp = (0x0F00 & Dn) >> 8;  //12位数据高字节
   //iic
    I2C_Start();                  //起始信号
    I2C_SendByte(SlaveAddress);   //器件寻址,器件代吗:1100; 地址位A2,A1,A0为 0 , 1 , 1最后一位为0-> 1100 0010
    I2C_SendByte(temp);            //发送高字节数据
    I2C_SendByte(Dn);             //将低8位送到DAC寄存器
    I2C_Stop();                   //发送停止信号
}


在此只提供部分程序,详细内容请下载后查看:
另外需要注意:
MCP4725引脚的连接方法:
VCC(VDD):+ 2.7V 至+ 5.5V
SDA:P2.2
SCL:P2.0
GND:接地

硬件连接条件:
1.找到硬件带芯片的那一面上的三个金属点,它们分别是GND,A0,VCC。将中间的金属点连接至VVC金属点。自此,MCP4725的物理地址变为0xC2。
可使用功能:1.改变MCP4725_WriteData_Voltage(1.21);括号内的数值,即可改变VOUT的输出电压。单位为V

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复