找个肯真心帮助在下的

2019-08-18 20:34发布

刚接触这个论坛,正好现在有一点地方弄不明白,寻求高人指点
不知道有没有人用过MCP4728这个片子,用IIC驱动的一个带四路缓冲输出的12 位电压输出DAC
本以为很简单就搞定了,可以一直拖了四五天却毫无进展,谁能给提点意见啊?小弟万分感谢!!!
下面是驱动程序,不知道哪里错了,连接方式很简单:VDD  gnd SCL SDA LDAC接地 RDY/BSY空接
下面是程序:(其中IIC用的是原子哥的就没必要贴上来了,只是驱动MCP4728的一段,方便的话大家可以尝试一下)
void MCP4728_WR(void)//500k接地输出
{
         u8 temp;
         u8 setBuf[8];
        setBuf[0]=0x94;
        setBuf[1]=0x00;
        setBuf[2]=0x92;
        setBuf[3]=0x00;
        setBuf[4]=0x93;
        setBuf[5]=0x00;
        setBuf[6]=0x94;
        setBuf[7]=0x00;
 IIC_Start();
 IIC_Send_Byte(0xc0);       //器件寻址
 IIC_Wait_Ack();  IIC_Send_Byte(0x50);   //设置顺序写起始地址    50eeprom 00 no eeprom
 IIC_Wait_Ack();  temp=setBuf[0]&0X0F;
 temp|=0xf0;
 IIC_Send_Byte(temp);   //1001高4位
 IIC_Wait_Ack();  IIC_Send_Byte(setBuf[1]);   //低8位
 IIC_Wait_Ack();  temp=setBuf[2]&0X0F;
 temp|=0xf0;
 IIC_Send_Byte(temp);   //1011高4位
 IIC_Wait_Ack();  IIC_Send_Byte(setBuf[3]);   //低8位
 IIC_Wait_Ack();  temp=setBuf[4]&0X0F;
 temp|=0xf0;
 IIC_Send_Byte(temp);   //1101高4位
 IIC_Wait_Ack();  IIC_Send_Byte(setBuf[5]);   //低8位
 IIC_Wait_Ack();  temp=setBuf[6]&0X0F;
 temp|=0xf0;
 IIC_Send_Byte(temp);   //1111高4位
 IIC_Wait_Ack();  IIC_Send_Byte(setBuf[7]);   //低8位
 IIC_Wait_Ack();  IIC_Stop();
}

   
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
26条回答
飘散的羽
1楼-- · 2019-08-20 01:14
回复【13楼】正点原子:
---------------------------------
例程不会有错的吧?我这里没有示波器,看不到信号....但是就直接飞俩个线过去接到片子上,这不就行了?

这是个4路的DA,那么我写进去值,应该这4路会有电压输出吧?但是我测不到,现在就纠结到这个地方了,不知道我理解的对不对....
飘散的羽
2楼-- · 2019-08-20 01:56
回复【14楼】飘散的羽:
---------------------------------
从MINI开发板的IIC上引出俩个线,接到MCP4728上的SCL跟SDA
飘散的羽
3楼-- · 2019-08-20 02:41
完蛋了....沉了吗???
正点原子
4楼-- · 2019-08-20 08:32
 精彩回答 2  元偷偷看……
augustedward
5楼-- · 2019-08-20 14:04
回复【16楼】飘散的羽:
---------------------------------

void wr_head_voltage(uint8_t *vol)
{
uint8_t i;
/*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2C1, ENABLE);
for(i=0;i<8;i++)
{
/* 发送起始位 */
    I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/
I2C_Send7bitAddress(I2C1,  SA_521&0xff, I2C_Direction_Transmitter);
  while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, i&0xff);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*数据已发送*/
I2C_SendData(I2C1, vol);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*数据已发送*/
   /* 停止位*/
   I2C_GenerateSTOP(I2C1, ENABLE);
delay_ms(5);
}
}

我这个是控制MAX521的IIC程序,用的是库函数,8路8位DAC。是结合原子的程序与库函数看懂后写的,已验证可以用。你自己看看芯片资料,注意下接口电平与数据传输延时,有的芯片通讯速度有要求,读写速度快慢都可能影响通讯
shihantu
6楼-- · 2019-08-20 18:22
高材生,没有搞懂9L原子的意思么?

1.检查有没有应答.如果没有应答,检查线路和芯片.
2.写入并读出寄存器,如果写入失败,检查时序和操作.
3.写入指定的寄存器,检查输出引脚,如果没有对应现象,检查线路.

具体到这个芯片,
1.执行5.4.4的1st,看有没有应答.
2.1.执行5.4.4所有步骤,看4th的bit4和bit0是否正确.
2.2.执行5.6.4和5.6.9,看写入和读出是否一致.
3.执行5.6.4,看引脚现象.

一周热门 更多>