#include "myiic.h" #include "delay.h" #include "bsp.h" //初始化IIC void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //使能GPIOB时钟 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_8; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_8); //PB6,PB7 输出高 } //产生IIC起始信号 void IIC_Start(void) { SDA_OUT(); //sda线输出 IIC_SDA_H; delay_us(1); IIC_SCL_H; delay_us(6); IIC_SDA_L;//START:when CLK is high,DATA change form high to low delay_us(6); IIC_SCL_L;//钳住I2C总线,准备发送或接收数据 delay_us(2); } //产生IIC停止信号 void IIC_Stop(void) { SDA_OUT();//sda线输出 IIC_SCL_L; IIC_SDA_L;//STOP:when CLK is high DATA change form low to high delay_us(5); IIC_SCL_H; delay_us(1); IIC_SDA_H;//发送I2C总线结束信号 delay_us(5); } //等待应答信号到来 //返回值:1,接收应答失败 // 0,接收应答成功 u8 IIC_Wait_Ack(void) { u32 ucErrTime=0; SDA_IN(); //SDA设置为输入 // IIC_SCL_L; // IIC_SDA_L; // delay_us(5); IIC_SDA_H;delay_us(1); IIC_SCL_H;delay_us(1); while(READ_SDA) { delay_us(1); ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } IIC_SCL_L;//时钟输出0 return 0; } //产生ACK应答 void IIC_Ack(void) { IIC_SCL_L; SDA_OUT(); IIC_SDA_L; delay_us(2); IIC_SCL_H; delay_us(2); IIC_SCL_L; } //不产生ACK应答 void IIC_NAck(void) { IIC_SCL_L; SDA_OUT(); IIC_SDA_H; delay_us(2); IIC_SCL_H; delay_us(2); IIC_SCL_L; } //IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答 void IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); IIC_SCL_L;//拉低时钟开始数据传输 for(t=0;t<8;t++) { //IIC_SDA=(txd&0x80)>>7; if((txd&0x80)>>7) IIC_SDA_H; else IIC_SDA_L; txd<<=1; delay_us(2); //对TEA5767这三个延时都是必须的 IIC_SCL_H; delay_us(2); IIC_SCL_L; delay_us(2); } } //读1个字节,ack=1时,发送ACK,ack=0,发送nACK u8 IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; SDA_IN();//SDA设置为输入 for(i=0;i<8;i++ ) { IIC_SCL_L; delay_us(2); IIC_SCL_H; receive<<=1; if(READ_SDA)receive++; delay_us(1); } if (!ack) IIC_NAck();//发送nACK else IIC_Ack(); //发送ACK return receive; }