IIC读\写从机数据时无应答

在使用IIC读取或写入从机数据时,需要先发送读取或写入命令。对于7位地址的从机来说,一般为先将7位的从机地质左移一位,然后再加上读或写的数据(读为1;写为0)。

例如:

从机地址为0x29。

则写命令为:0x52;读命令为0x53。

有时根据从机数据手册所给的从机地址发送后从机并无应答,或为从机地址错误,此时可以从0x00开始,每次加1,递增发送读取命令,直到从机应答,获得从机IIC地址。

注意:不可使用写入命令来发送进行测试,一旦得到写入正确的IIC地址后,从机应答,后一个发送的命令将会写入从机,错误的指令可能会使得从机报错错误。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是AT32F421 IIC作为从机应答的示例代码,仅供参考: ```c #include "at32f4xx.h" #include "at32_board.h" #define I2C_SLAVE_ADDRESS 0x50 uint8_t I2C_Buffer[256]; uint8_t I2C_BufferIndex = 0; uint8_t I2C_BufferSize = 0; void I2C_Configuration(void) { GPIO_InitType GPIO_InitStructure; I2C_InitType I2C_InitStructure; NVIC_InitType NVIC_InitStructure; /* enable I2C1 and GPIOB clock */ RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_I2C1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB, ENABLE); /* Configure I2C1 pins: SCL and SDA */ GPIO_InitStructure.GPIO_Pins = GPIO_Pins_6 | GPIO_Pins_7; GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); /* I2C1 configuration */ I2C_InitStructure.I2C_Mode = I2C_Mode_I2CDevice; I2C_InitStructure.I2C_FmDutyCycle = I2C_FmDutyCycle_2_1; I2C_InitStructure.I2C_OwnAddress = I2C_SLAVE_ADDRESS; I2C_InitStructure.I2C_Speed = 100000; I2C_Init(I2C1, &I2C_InitStructure); /* enable I2C1 event and error interrupts */ NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn; NVIC_Init(&NVIC_InitStructure); /* Enable I2C1 interrupts */ I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_ERR, ENABLE); /* Enable I2C1 */ I2C_Cmd(I2C1, ENABLE); } void I2C_SendData(uint8_t* pBuffer, uint8_t NumByteToWrite) { I2C_BufferIndex = 0; I2C_BufferSize = NumByteToWrite; /* wait until I2C is not busy */ while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BusBusy)); /* send start condition */ I2C_GenerateSTART(I2C1, ENABLE); /* wait until start condition is generated */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); /* send slave address */ I2C_Send7bitAddress(I2C1, I2C_SLAVE_ADDRESS, I2C_Direction_Transmitter); /* wait until address is sent */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); /* send data */ while(NumByteToWrite--) { I2C_SendData(I2C1, *pBuffer++); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); } /* send stop condition */ I2C_GenerateSTOP(I2C1, ENABLE); /* wait until stop condition is generated */ while(I2C_GetFlagStatus(I2C1, I2C_FLAG_StopDetect)); } void I2C1_EV_IRQHandler(void) { switch(I2C_GetLastEvent(I2C1)) { /* start condition sent */ case I2C_EVENT_MASTER_MODE_SELECT: /* send slave address */ I2C_Send7bitAddress(I2C1, I2C_SLAVE_ADDRESS, I2C_Direction_Receiver); break; /* address sent (transmitter mode) */ case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: break; /* data sent */ case I2C_EVENT_MASTER_BYTE_TRANSMITTED: if(I2C_BufferIndex < I2C_BufferSize) { /* send next data byte */ I2C_SendData(I2C1, I2C_Buffer[I2C_BufferIndex++]); } break; /* data received */ case I2C_EVENT_MASTER_BYTE_RECEIVED: /* do something with received data */ /* ... */ break; default: break; } } int main(void) { uint8_t data[] = {0xAA, 0xBB, 0xCC}; /* configure I2C1 */ I2C_Configuration(); /* send data to master device */ I2C_SendData(data, sizeof(data)); while(1) { /* do something */ /* ... */ } } ``` 这是一个简单的I2C从机应答例程,其中I2C_SendData()函数用于向主设备发送数据。在主函数中,首先需要调用I2C_Configuration()函数配置I2C通信参数。然后,通过调用I2C_SendData()函数向主设备发送数据。在中断服务程序(I2C1_EV_IRQHandler)中,根据不同的I2C事件进行处理。当主设备发送请求,从设备会响应并发送数据。最后,可以在主函数中对收到的数据进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值