Hello, everybody
MCU communicates with ADS1119 chip through analog IIC, and the data converted by the chip is always equal to 0,I don't know what the problem is.
IIC source code:
#include "iic.h"
#include "main.h"
#include "stm32f4xx_hal.h"
#include "stdio.h"
//#include "delay.h"
#define IIC_SDA_1 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,GPIO_PIN_SET)
#define IIC_SDA_0 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,GPIO_PIN_RESET)
#define IIC_SCL_1 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET)
#define IIC_SCL_0 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET)
#define IIC_SDA_READ HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11)
void iic_init(void)//
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
IIC_SDA_1;
IIC_SCL_1;
}
void iic_start(void)
{
SDA_OUT();
IIC_SDA_1;
IIC_SCL_1;
delay_us(100);
IIC_SDA_0;
delay_us(100);
IIC_SCL_0;
delay_us(100);
}
void iic_stop(void)
{
SDA_OUT();
IIC_SDA_0;
delay_us(100);
IIC_SCL_1;
delay_us(100);
IIC_SDA_1;
delay_us(100);
}
void ack(void)//主机应答
{
SDA_OUT();
IIC_SDA_0;
delay_us(100);
IIC_SCL_1;
delay_us(100);
IIC_SCL_0;
delay_us(100);
IIC_SDA_1;
}
void noack(void)
{
SDA_OUT();
IIC_SDA_1;
delay_us(100);
IIC_SCL_1;
delay_us(100);
IIC_SCL_0;
delay_us(100);
IIC_SDA_0;
}
uint8_t wait_ack(void)
{
uint8_t wo,a;
SDA_OUT();
IIC_SDA_1;
delay_us(100);
IIC_SCL_1;
delay_us(100);
SDA_IN();
if(IIC_SDA_READ)
{
wo = 1;
}
else
{
wo = 0;
}
IIC_SCL_0;
return wo;
}
void iic_write(uint8_t cmd)
{
SDA_OUT();
IIC_SCL_0;
for(uint8_t i = 0;i < 8;i++)
{
if(cmd&0x80)
IIC_SDA_1;
else
IIC_SDA_0;
cmd<<=1;
IIC_SCL_1;
delay_us(100);
IIC_SCL_0;
delay_us(100);
}
//
}
uint8_t iic_read(void)
{
uint8_t i,a;
uint8_t val = 0;
SDA_IN();
for(i=0;i<8;i++)
{
IIC_SCL_1;
delay_us(100);
val=val<<1;
//if(GPIOB->IDR& GPIO_IDR_IDR7)
if(IIC_SDA_READ)
{
val|=0x01;
}
IIC_SCL_0;
delay_us(100);
}
return val;
}
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}