STM32
直播中

李慧

7年用户 893经验值
私信 关注
[问答]

用STM32F407配置ADS1100的驱动程序,读AD时,单片机发送应答信号的语句应该怎么写的?

     现在在用STM32F407配置ADS1100的驱动程序,ADS1100用的是I2C总线,在芯片的数据 手册上面看了读写的时序。        读AD时,单片机发送应答信号的语句应该怎么写的?在时序图中是一个低电平信号,是不是就是说,接收完一个字节数据之后产生一个低电平信号来作为应答。        附上我的配置代码。


  • void I2C_Configure(void)
  • {
  •   I2C_InitTypeDef  I2C_InitStructure;

  •   GPIO_InitTypeDef  GPIO_InitStructure;

  •   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
  •   RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);

  •   GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_I2C1);
  •   GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_I2C1);
  •   //PB8  SCL   PB9  SDA
  •   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9;
  •   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  •   GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  •   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  •   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  •   GPIO_Init(GPIOB,  GPIO_InitStructure);

  •   I2C_DeInit(I2C1);
  •   I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  •   I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  •   I2C_InitStructure.I2C_OwnAddress1 = 0x90;  //ADS1100地址
  •   I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;  //ack enable
  •   I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  •   I2C_InitStructure.I2C_ClockSpeed = 100000;  //100kHz

  •   I2C_Cmd(I2C1, ENABLE);
  •   I2C_Init(I2C1,  I2C_InitStructure);
  • }


  • void Write_AD(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t value)
  • {
  •   I2C_GenerateSTART(I2Cx,ENABLE);
  •   //产生起始条件
  •   while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
  •   //等待ACK
  •   I2C_Send7bitAddress(I2Cx,I2C_Addr,I2C_Direction_Transmitter);
  •   //向设备发送设备地址
  •   while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  •   //等待ACK
  •   I2C_SendData(I2Cx, value);
  •   //发送数据
  •   while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  •   //发送完成
  •   I2C_GenerateSTOP(I2Cx, ENABLE);
  •   //产生结束信号
  • }


  • u16 Read_AD(I2C_TypeDef *I2Cx,uint8_t I2C_Addr)
  • {
  •   u8 ADCdatah,ADCdatal;
  •   u16 ADCdata;
  •   //等待I2C总线空闲
  •   while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
  •   //发送起始条件
  •   I2C_GenerateSTART(I2Cx, ENABLE);
  •   //等待ACK
  •   while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
  •   //向设备发送设备地址
  •   I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);
  •   //等待ACK
  •   while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  •   while(!(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)));

  •   ADCdatah = I2C_ReceiveData(I2Cx);

  • //从时序图中看到,读取一个字节数据之后,单片机需要产生一个应答信号,这里应答信号应该怎么写的?求各位棒棒忙,感激不尽!

  •   while(!(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)));

  •   ADCdatal = I2C_ReceiveData(I2Cx);

  •   I2C_AcknowledgeConfig(I2Cx, DISABLE);

  •   I2C_GenerateSTOP(I2Cx, ENABLE);

  •   ADCdata = ADCdatah * 256 + ADCdatal;

  •   return ADCdata;
  • }






回帖(1)

李丽

2024-5-14 17:00:23
在STM32F407配置ADS1100的驱动程序中,使用I2C总线进行通信。在读取AD数据时,单片机需要发送应答信号。应答信号是一个低电平信号,表示接收完一个字节数据后,准备接收下一个字节数据。

在STM32F407中,可以使用HAL库函数来实现I2C通信。以下是如何发送应答信号的示例:

1. 首先,确保已经包含了HAL库的头文件:

```c
#include "stm32f4xx_hal.h"
```

2. 在I2C初始化函数中,配置I2C参数:

```c
void I2C_Configure(void) {
  I2C_HandleTypeDef I2C_Handle;

  // 配置I2C时钟、GPIO等
  // ...

  // 初始化I2C
  I2C_Handle.Instance = I2Cx;
  I2C_Handle.Init.ClockSpeed = 100000;
  I2C_Handle.Init.DutyCycle = I2C_DUTYCYCLE_2;
  I2C_Handle.Init.OwnAddress1 = 0;
  I2C_Handle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  I2C_Handle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  I2C_Handle.Init.OwnAddress2 = 0;
  I2C_Handle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  I2C_Handle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

  if (HAL_I2C_Init(&I2C_Handle) != HAL_OK) {
    // 初始化失败
  }
}
```

3. 在读取AD数据的函数中,使用HAL库函数HAL_I2C_Master_Receive()来接收数据。在接收到一个字节数据后,可以通过HAL_I2C_Master_Sequential_Receive()函数继续接收下一个字节数据,或者使用HAL_I2C_Master_Sequential_Transmit()函数发送应答信号。

```c
void Read_ADS1100(uint8_t *data, uint16_t length) {
  I2C_HandleTypeDef *I2C_Handle_Ptr = &I2C_Handle; // 假设I2C_Handle已经在I2C_Configure()中初始化

  // 发送ADS1100的I2C地址和读取命令
  // ...

  // 接收数据
  if (HAL_I2C_Master_Receive(I2C_Handle_Ptr, ADS1100_I2C_ADDR, data, length, I2C_FIRST_AND_LAST_FRAME) != HAL_OK) {
    // 接收失败
  }

  // 发送应答信号
  if (HAL_I2C_Master_Sequential_Transmit(I2C_Handle_Ptr, ADS1100_I2C_ADDR, (uint8_t *)data, 1, I2C_LAST_FRAME) != HAL_OK) {
    // 发送应答信号失败
  }
}
```

在这个示例中,HAL_I2C_Master_Receive()函数用于接收数据,HAL_I2C_Master_Sequential_Transmit()函数用于发送应答信号。注意,这里假设ADS1100的I2C地址已经定义为ADS1100_I2C_ADDR。

请根据您的具体需求和硬件配置调整上述示例代码。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分