微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 模拟IIC协议驱动TEA5767

STM32 模拟IIC协议驱动TEA5767

时间:12-02 来源:互联网 点击:
IIC驱动程序参考自《ALIENTEK MINISTM32 实验16 IIC实验》,做了简单的修改就轻易驱动TEA5767。至于TEA5767内部寄存器的配置就不说了。看程序:

文件:I2C_Driver.h

#ifndef __I2C_Driver_H

#define __I2C_Driver_H

#define uchar unsigned char

#define uint unsigned short int

#define ulint unsigned int

#define delay_nus 2

//IO方向设置

#define SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<12;}//

#define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<12;}

//IO操作函数

#define IIC_SCL PBout(10) //SCL

#define IIC_SDA PBout(11) //SDA

#define READ_SDA PBin(11) //输入SDA

//IIC所有操作函数

void IIC_Init(void); //初始化IIC的IO口

void IIC_Start(void); //发送IIC开始信号

void IIC_Stop(void); //发送IIC停止信号

void IIC_Send_Byte(uchar txd); //IIC发送一个字节

uchar IIC_Read_Byte(unsigned char ack);//IIC读取一个字节

uchar IIC_Wait_Ack(void); //IIC等待ACK信号

void IIC_Ack(void); //IIC发送ACK信号

void IIC_NAck(void); //IIC不发送ACK信号

void IIC_Write_One_Byte(uchar daddr,uchar addr,uchar data);

uchar IIC_Read_One_Byte(uchar daddr,uchar addr);

void Write_TEA5767(void);

void Read_TEA5767(void);

void TEA5767(void);

void Radio_Set_Frequency(void);

void Radio_Manual_Search(void);

void Radio_Search (void);

void Radio_Power_Display(void);

void Radio_Frequency_Display(void);

#endif

文件:I2C_Driver.c

#include "I2C_Driver.h"

#include "GUI.h"

#include "enhance.h"

uchar ack_cnt=0;

void delay_us(uint t)

{

t=72*t;

while(t-->0);

}

//初始化IIC

void IIC_Init(void)

{

RCC->APB2ENR|=1<3;//先使能外设IO PORTB时钟

GPIOB->CRH&=0XFFFF00FF;//PB10/11 推挽输出

GPIOB->CRH|=0X00003300;

GPIOB->ODR|=3<10; //PB10/11 输出高

}

//产生IIC起始信号

void IIC_Start(void)

{

SDA_OUT(); //sda线输出

IIC_SDA=1;

IIC_SCL=1;

delay_us(delay_nus);

IIC_SDA=0;//START:when CLK is high,DATA change form high to low

delay_us(delay_nus);

IIC_SCL=0;//钳住I2C总线,准备发送或接收数据

}

//产生IIC停止信号

void IIC_Stop(void)

{

SDA_OUT();//sda线输出

IIC_SCL=0;

IIC_SDA=0;//STOP:when CLK is high DATA change form low to high

delay_us(delay_nus);

IIC_SCL=1;

IIC_SDA=1;//发送I2C总线结束信号

delay_us(delay_nus);

}

//等待应答信号到来

//返回值:1,接收应答失败

// 0,接收应答成功

uchar IIC_Wait_Ack(void)

{

uchar ucErrTime=0;

SDA_IN(); //SDA设置为输入

IIC_SDA=1;delay_us(delay_nus);

IIC_SCL=1;delay_us(delay_nus);

while(READ_SDA)

{

ucErrTime++;

if(ucErrTime>250)

{

IIC_Stop();

return 1;

}

}

IIC_SCL=0;//时钟输出0

ack_cnt++;

return 0;

}

//产生ACK应答

void IIC_Ack(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=0;

delay_us(delay_nus);

IIC_SCL=1;

delay_us(delay_nus);

IIC_SCL=0;

}

//不产生ACK应答

void IIC_NAck(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=1;

delay_us(delay_nus);

IIC_SCL=1;

delay_us(delay_nus);

IIC_SCL=0;

}

//IIC发送一个字节

//返回从机有无应答

//1,有应答

//0,无应答

void IIC_Send_Byte(uchar txd)

{

uchar t;

SDA_OUT();

IIC_SCL=0;//拉低时钟开始数据传输

for(t=0;t<8;t++)

{

IIC_SDA=(txd&0x80)>>7;

txd<=1;

delay_us(delay_nus); //对TEA5767这三个延时都是必须的

IIC_SCL=1;

delay_us(delay_nus);

IIC_SCL=0;

delay_us(delay_nus);

}

}

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK

uchar IIC_Read_Byte(unsigned char ack) //

{

unsigned char i,receive=0;

SDA_IN();//SDA设置为输入

for(i=0;i<8;i++ )

{

delay_us(2);

IIC_SCL=1;

receive<=1;

delay_us(2);

if(READ_SDA)receive++;

IIC_SCL=0;

}

if (!ack)

IIC_NAck();//发送nACK

else

IIC_Ack(); //发送ACK

return receive;

}

///////////////TEA5767/////////////////////

#define W_TEA5767 0xc0

#define R_TEA5767 0xc1

unsigned char Radio_Read_Buf[5]="12345";

unsigned char Radio_Write_Buf[5]={0x2a,0xb6,0x40,0x17,0x40}; //要写入TEA5767的数据

#define Max_frequency 108000

#define Min_frequency 87500

#define Mute_On 1

#define Mute_Off 0

unsigned long Frequency_Write=93600;

unsigned long Frequency_Read=0;

unsigned long pll=0;

unsigned char Search_Mode_Flag=0,Radio_On_Flag=0;//

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top