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;
|
||
}
|