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