?? myiic.c
字號(hào):
#include"myiic.h"
//STM32軟件模擬IIC,STM32的硬件IIC太難用了!
//能很好的支持FM24C16&PT2314&TEA5767
//正點(diǎn)原子@SCUT
//V1.0
//us延時(shí)函數(shù)
void delay(u8 nus)
{
u16 i;
while(nus--)for(i=15;i>0;i--);
}
//初始化IIC
//CHECK OK 09/05/18
void IIC_Init(void)
{
RCC->APB2ENR|=0X00000008;//先使能外設(shè)IO PORTB時(shí)鐘
GPIOB->CRH&=0XFFFF00FF;//PB10/11 推挽輸出
GPIOB->CRH|=0X00003300;
GPIOB->ODR|=0X0C00; //0-2 輸出高
}
//產(chǎn)生IIC起始信號(hào)
//CHECK OK 09/05/18
void IIC_Start(void)
{
SDA_OUT(); //sda線(xiàn)輸出
IIC_SDA_SET(1);
IIC_SCL_SET(1);
delay(4);
IIC_SDA_SET(0);//START:when CLK is high,DATA change form high to low
delay(4);
IIC_SCL_SET(0);//鉗住I2C總線(xiàn),準(zhǔn)備發(fā)送或接收數(shù)據(jù)
}
//產(chǎn)生IIC停止信號(hào)
//CHECK OK 09/05/18
void IIC_Stop(void)
{
SDA_OUT();//sda線(xiàn)輸出
IIC_SCL_SET(0);
IIC_SDA_SET(0);//STOP:when CLK is high DATA change form low to high
delay(4);
IIC_SCL_SET(1);
IIC_SDA_SET(1);//發(fā)送I2C總線(xiàn)結(jié)束信號(hào)
}
//等待應(yīng)答信號(hào)到來(lái)
//返回值:0,接收應(yīng)答失敗
// 1,接收應(yīng)答成功
//CHECK OK 09/05/18
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA設(shè)置為輸入
IIC_SDA_SET(1);delay(1);
IIC_SCL_SET(1);
while(READ_SDA())
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 0;
}
}
IIC_SCL_SET(0);//時(shí)鐘輸出0
return 1;
}
//產(chǎn)生ACK應(yīng)答
//CHECK OK 09/05/18
void IIC_Ack(void)
{
IIC_SCL_SET(0);
SDA_OUT();
IIC_SDA_SET(0);
delay(1);
IIC_SCL_SET(1);
delay(1);
IIC_SCL_SET(0);
}
//不產(chǎn)生ACK應(yīng)答
//CHECK OK 09/05/18
void IIC_NAck(void)
{
IIC_SCL_SET(0);
SDA_OUT();
IIC_SDA_SET(1);
delay(1);
IIC_SCL_SET(1);
delay(1);
IIC_SCL_SET(0);
}
//IIC發(fā)送一個(gè)字節(jié)
//返回從機(jī)有無(wú)應(yīng)答
//1,有應(yīng)答
//0,無(wú)應(yīng)答
//CHECK OK 09/05/18
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL_SET(0);//拉低時(shí)鐘開(kāi)始數(shù)據(jù)傳輸
for(t=0;t<8;t++)
{
IIC_SDA_SET((txd&0x80)>>7);
txd<<=1;
delay(1); //對(duì)TEA5767這三個(gè)延時(shí)都是必須的
IIC_SCL_SET(1);
delay(1);
IIC_SCL_SET(0);
delay(1);
}
}
//讀1字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK
//CHECK OK 09/05/18
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA設(shè)置為輸入
for(i=0;i<8;i++ )
{
IIC_SCL_SET(0);
delay(1);
IIC_SCL_SET(1);
receive<<=1;
if(READ_SDA())receive++;
}
if (!ack)
IIC_NAck();//發(fā)送nACK
else
IIC_Ack(); //發(fā)送ACK
return receive;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -