149 lines
3.2 KiB
C
149 lines
3.2 KiB
C
|
#include "main.h"
|
|||
|
uint8_t BYTE_BUF[2];
|
|||
|
//I2C GPIO初始化
|
|||
|
void I2C_Init(void)
|
|||
|
{
|
|||
|
rcu_periph_clock_enable(RCU_GPIOB); //使能GPIOB时钟
|
|||
|
// PB6--SCL,PB7--SDA.(I2C0)
|
|||
|
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6 | GPIO_PIN_7);
|
|||
|
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);
|
|||
|
gpio_bit_set(GPIOB, GPIO_PIN_6 | GPIO_PIN_7);
|
|||
|
}
|
|||
|
//产生IIC起始信号
|
|||
|
void IIC_Start(void)
|
|||
|
{
|
|||
|
//SDA_OUT(); //sda线输出
|
|||
|
IIC_SDA_SET;
|
|||
|
IIC_SCL_SET;
|
|||
|
delay_us(4);
|
|||
|
IIC_SDA_RET; //START:when CLK is high,DATA change form high to low
|
|||
|
delay_us(4);
|
|||
|
IIC_SCL_RET; //钳住I2C总线,准备发送或接收数据
|
|||
|
}
|
|||
|
//产生IIC停止信号
|
|||
|
void IIC_Stop(void)
|
|||
|
{
|
|||
|
//SDA_OUT(); //sda线输出
|
|||
|
IIC_SCL_RET;
|
|||
|
IIC_SDA_RET; //STOP:when CLK is high DATA change form low to high
|
|||
|
delay_us(4);
|
|||
|
IIC_SCL_SET;
|
|||
|
IIC_SDA_SET; //发送I2C总线结束信号
|
|||
|
delay_us(4);
|
|||
|
}
|
|||
|
//等待应答信号到来
|
|||
|
//返回值:1,接收应答失败
|
|||
|
// 0,接收应答成功
|
|||
|
uint8_t IIC_Wait_Ack(void)
|
|||
|
{
|
|||
|
uint8_t ucErrTime = 0;
|
|||
|
//SDA_IN(); //SDA设置为输入
|
|||
|
IIC_SDA_SET;
|
|||
|
delay_us(1);
|
|||
|
IIC_SCL_SET;
|
|||
|
delay_us(1);
|
|||
|
while (READ_SDA)
|
|||
|
{
|
|||
|
ucErrTime++;
|
|||
|
if (ucErrTime > 250)
|
|||
|
{
|
|||
|
IIC_Stop();
|
|||
|
return 1;
|
|||
|
}
|
|||
|
delay_us(1);
|
|||
|
}
|
|||
|
IIC_SCL_RET; //时钟输出0
|
|||
|
return 0;
|
|||
|
}
|
|||
|
//产生ACK应答
|
|||
|
void IIC_Ack(void)
|
|||
|
{
|
|||
|
IIC_SCL_RET;
|
|||
|
//SDA_OUT();
|
|||
|
IIC_SDA_RET;
|
|||
|
delay_us(2);
|
|||
|
IIC_SCL_SET;
|
|||
|
delay_us(2);
|
|||
|
IIC_SCL_RET;
|
|||
|
}
|
|||
|
//不产生ACK应答
|
|||
|
void IIC_NAck(void)
|
|||
|
{
|
|||
|
IIC_SCL_RET;
|
|||
|
//SDA_OUT();
|
|||
|
IIC_SDA_SET;
|
|||
|
delay_us(2);
|
|||
|
IIC_SCL_SET;
|
|||
|
delay_us(2);
|
|||
|
IIC_SCL_RET;
|
|||
|
}
|
|||
|
//IIC发送一个字节
|
|||
|
//返回从机有无应答
|
|||
|
//1,有应答
|
|||
|
//0,无应答
|
|||
|
void IIC_Send_Byte(uint8_t txd)
|
|||
|
{
|
|||
|
uint8_t t;
|
|||
|
//SDA_OUT();
|
|||
|
IIC_SCL_RET; //拉低时钟开始数据传输
|
|||
|
for (t = 0; t < 8; t++)
|
|||
|
{
|
|||
|
if ((txd & 0x80) >> 7)
|
|||
|
IIC_SDA_SET;
|
|||
|
else
|
|||
|
IIC_SDA_RET;
|
|||
|
txd <<= 1;
|
|||
|
delay_us(2); //对TEA5767这三个延时都是必须的
|
|||
|
IIC_SCL_SET;
|
|||
|
delay_us(2);
|
|||
|
IIC_SCL_RET;
|
|||
|
delay_us(2);
|
|||
|
}
|
|||
|
}
|
|||
|
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
|
|||
|
uint8_t IIC_Read_Byte(unsigned char ack)
|
|||
|
{
|
|||
|
unsigned char i, receive = 0;
|
|||
|
//SDA_IN(); //SDA设置为输入
|
|||
|
for (i = 0; i < 8; i++)
|
|||
|
{
|
|||
|
IIC_SCL_RET;
|
|||
|
delay_us(2);
|
|||
|
IIC_SCL_SET;
|
|||
|
receive <<= 1;
|
|||
|
if (READ_SDA)
|
|||
|
receive++;
|
|||
|
delay_us(1);
|
|||
|
}
|
|||
|
if (!ack)
|
|||
|
IIC_NAck(); //发送nACK
|
|||
|
else
|
|||
|
IIC_Ack(); //发送ACK
|
|||
|
return receive;
|
|||
|
}
|
|||
|
|
|||
|
uint8_t LTC2451_NewConv(void)
|
|||
|
{
|
|||
|
IIC_Start();
|
|||
|
IIC_Send_Byte(LTC2451_ADDR_W);
|
|||
|
if (IIC_Wait_Ack() != 0)
|
|||
|
return 1;
|
|||
|
IIC_Stop();
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
uint8_t LTC2451_ReadAdc(uint16_t *adc_value)
|
|||
|
{
|
|||
|
uint8_t temp[2];
|
|||
|
IIC_Start();
|
|||
|
IIC_Send_Byte(LTC2451_ADDR_R);
|
|||
|
if (IIC_Wait_Ack() != 0)
|
|||
|
return 1;
|
|||
|
temp[0] = IIC_Read_Byte(1);
|
|||
|
temp[1] = IIC_Read_Byte(0);
|
|||
|
IIC_Stop(); //产生一个停止条件
|
|||
|
|
|||
|
*adc_value = (temp[0] << 8) + temp[1];
|
|||
|
return 0;
|
|||
|
}
|