areak 发表于 2014-12-30 18:35

AD5933数据能够写入,但是无法读出,求解

STM32通过I2C读写AD5933数据, 用的是STM32的I2C1, 数据可以正常写入,测量AD5933可以产生激励信号,但是却读不回来数据,无论读哪个寄存器地址,读出来的都是0X1A。
不知道是不是STM32的I2C读函数写错了,手册上写的读字节时序,最后一个位是非应答,这里有点不确定是怎么操作。

areak 发表于 2014-12-30 18:39

本帖最后由 areak 于 2014-12-30 18:42 编辑

void I2C_Pointer_Write(unsigned char reg_addr)
{
      while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
      I2C_GenerateSTART(I2C1,ENABLE);
      while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
      
      I2C_Send7bitAddress(I2C1,0X1A,I2C_Direction_Transmitter);
      while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
      
      I2C_SendData(I2C1,0XB0);
      while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
      
      I2C_SendData(I2C1,reg_addr);
      while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
      
      I2C_GenerateSTOP(I2C1,ENABLE);
}

char I2C_Byte_Read(unsigned char reg_addr)
{
      char recieve_data;
      
      I2C_Pointer_Write(reg_addr);

while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

/* Send START condition */
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(I2C1, 0X1B, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
      

   /* Disable Acknowledgement */
I2C_AcknowledgeConfig(I2C1, DISABLE);
      recieve_data = I2C_ReceiveData(I2C1);
I2C_GenerateSTOP(I2C1, ENABLE);

/* Enable Acknowledgement to be ready for another reception */
I2C_AcknowledgeConfig(I2C1, ENABLE);
      return recieve_data;
}

这是读AD5933的函数。

areak 发表于 2014-12-31 09:11

怎么都没人回复的?

weizhongc 发表于 2014-12-31 11:04

本帖最后由 weizhongc 于 2014-12-31 11:18 编辑

{:1_99:}硬件的I2C,要不你先用模拟的试下啊。不然你改下你的读取函数,是最后一个字节读取时不要ack。不是所有读取操作都不要ACK
char I2C_Byte_Read(unsigned char reg_addr,unsigned char ack)
{
      char recieve_data;
      
      I2C_Pointer_Write(reg_addr);

while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

/* Send START condition */
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(I2C1, 0X1B, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
      

   /* Disable Acknowledgement */
if(ack)
I2C_AcknowledgeConfig(I2C1, DISABLE);
else
I2C_AcknowledgeConfig(I2C1, ENABLE);

      recieve_data = I2C_ReceiveData(I2C1);
I2C_GenerateSTOP(I2C1, ENABLE);

/* Enable Acknowledgement to be ready for another reception */
I2C_AcknowledgeConfig(I2C1, ENABLE);
      return recieve_data;
}

areak 发表于 2014-12-31 15:20

已搞定,谢谢你

areak 发表于 2014-12-31 15:22

weizhongc 发表于 2014-12-31 11:04
硬件的I2C,要不你先用模拟的试下啊。不然你改下你的读取函数,是最后一个字节读取时不要ack。不是所有读取操作都不要ACK
char I2C_Byte_Read(unsigned char reg_addr,unsigned char ack)
{
      char recieve_data;
      
      I2C_Pointer_Write(reg_addr);

while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

/* Send START condition */
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(I2C1, 0X1B, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
      

   /* Disable Acknowledgement */
if(ack)
I2C_AcknowledgeConfig(I2C1, DISABLE);
else
I2C_AcknowledgeConfig(I2C1, ENABLE);

      recieve_data = I2C_ReceiveData(I2C1);
I2C_GenerateSTOP(I2C1, ENABLE);

/* Enable Acknowledgement to be ready for another reception */
I2C_AcknowledgeConfig(I2C1, ENABLE);
      return recieve_data;
}解决了,程序问题,谢谢

weizhongc 发表于 2014-12-31 16:00

<div class='shownolgin' data-isdigest='no'>什么问题啊areak 发表于 2014-12-31 15:22
解决了,程序问题,谢谢
</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

areak 发表于 2014-12-31 16:23

<div class='shownolgin' data-isdigest='no'>I2C_Send7bitAddress(I2C1, 0X1B, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));低级错误,这两句写错了。I2C_Direction_Transmitter-->I2C_Direction_RecieverI2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED-->I2C_EVENT_MASTER_RECIRVER_MODE_SELECTEDweizhongc 发表于 2014-12-31 16:00
什么问题啊

</div><script>showreplylogin();</script>

麻辣鸡丶 发表于 2020-5-20 09:41

<div class='shownolgin' data-isdigest='no'>老哥还在么....虽然现在是2020年了,距离您发帖有6年,6年轻我还在参加中考哈哈哈,现在我在用AD5933,我怎么样都写不进去,因为我写入后读出来发现寄存器是空的,大佬如果能看到能给小弟发一下您的数据写入的函数吗,谢谢了我块搞了一个多月了,一直卡着没进展要哭了</div><script>showreplylogin();</script>
页: [1]
查看完整版本: AD5933数据能够写入,但是无法读出,求解