STM32通过I2C读写AD5933数据, 用的是STM32的I2C1, 数据可以正常写入,测量AD5933可以产生激励信号,但是却读不回来数据,无论读哪个寄存器地址,读出来的都是0X1A。
不知道是不是STM32的I2C读函数写错了,手册上写的读字节时序,最后一个位是非应答,这里有点不确定是怎么操作。
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-30 18:42 编辑
硬件的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 11:18 编辑
老哥还在么....虽然现在是2020年了,距离您发帖有6年,6年轻我还在参加中考哈哈哈,现在我在用AD5933,我怎么样都写不进去,因为我写入后读出来发现寄存器是空的,大佬如果能看到能给小弟发一下您的数据写入的函数吗,谢谢了我块搞了一个多月了,一直卡着没进展要哭了