|
說明:本例程實驗STM32F103ZET6與AT24C02通訊,初次編寫,歡迎大佬批正。
接口如下:
SDA PA5
SCL PA4
LED PE5
現(xiàn)象:復(fù)寫成功,PE5輸出低電平
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IIC.C
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "iic.h"
#include "sys.h"
#include "delay.h"
#define IICDELAY delay_us(10);
#define SDA_IN sda_i();
#define SDA_OUT sda_o();
#define SDA_H GPIOA->ODR|= (1<<5);
#define SDA_L GPIOA->ODR&= ~(1<<5);
#define SCL_H GPIOA->ODR|= (1<<4);
#define SCL_L GPIOA->ODR&= ~(1<<4);
#define SDA ((GPIOA->IDR)>>5)&0X01
//PB3 SCL PB4 SDA
/*IIC初始化*/
void iic_init(void)
{
RCC->APB2ENR |= 1<<2;//使能PA時鐘
GPIOA->CRL &= ~(0xff << 4*3) ; //清除CRL第20到23位值
GPIOA->CRL |= 0x33 << 4*3; //設(shè)置B3B4輸出 50MHZ模式
GPIOA->ODR |= (1<<5)|(1<<4); //設(shè)置為高電平
}
/*端口輸入模式*/
void sda_i(void)
{
GPIOA->CRL &= ~(0xf0 << 4*4) ; //清除CRL第20到23位值
GPIOA->CRL |= 0x80 << 4*4; //設(shè)置B3B4輸入 默認(rèn)上拉 50MHz模式
GPIOA->ODR |= (1<<5); //設(shè)置為上拉模式
}
/*端口輸出模式*/
void sda_o(void)
{
GPIOA->CRL &= ~(0xf0 << 4*4) ; //清除CRL第20到23位值
GPIOA->CRL |= 0x30 << 4*4; //設(shè)置B3B4輸出 50MHz模式
}
/*IIC起始信號*/
void iic_start(void)
{
SDA_OUT
SCL_H
IICDELAY
SDA_H
IICDELAY
SDA_L
IICDELAY
}
/*IIC終止信號*/
void iic_stop(void)
{
SDA_OUT
SDA_L
IICDELAY
SCL_H
IICDELAY
SDA_H
IICDELAY
}
/*主機發(fā)送應(yīng)答*/
void master_ack(char i)//0為不應(yīng)答
{
SDA_OUT
SCL_L
IICDELAY
if(i)
SDA_L
else
SDA_H
IICDELAY
SCL_H
IICDELAY
SDA_IN
SCL_L
}
/*檢測從機應(yīng)答*/
char test_ack(void)
{
SDA_IN
SCL_H
IICDELAY
if(SDA) //如果高電平 非應(yīng)答
{
SCL_L
IICDELAY
iic_stop();
return(0);
}
else //低電平 應(yīng)答
{
SCL_L
IICDELAY
return(1);
}
}
/*發(fā)送一個字節(jié)*/
void iic_send_byte(unsigned char byte)
{
unsigned char i;
SDA_OUT
for(i = 0;i < 8;i++)
{
SCL_L
IICDELAY
if(byte&0x80)
SDA_H
else
SDA_L
IICDELAY
SCL_H
IICDELAY
byte<<=1;
}
SCL_L
IICDELAY
SDA_IN
IICDELAY
}
/*讀一個字節(jié)*/
unsigned char iic_read_byte(void)
{
unsigned char dat,i;
SCL_L
IICDELAY
SDA_IN
IICDELAY
for(i = 0;i < 8;i ++)
{
SCL_H
IICDELAY
if(SDA)
{
dat|=0x01;
}
else
{
dat&=0xfe;
}
IICDELAY
SCL_L
IICDELAY
if(i < 7)
{
dat = dat << 1;
}
}
return(dat);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AT24C02.C
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "24cxx.h"
#define AT24C02_ADDR 0xa0
/*AT24C02初始化*/
void AT24CXX_init(void)
{
iic_init();
}
/*發(fā)送數(shù)據(jù)*/
unsigned char AT24CXX_TransmitData(unsigned char ADDR,unsigned char DAT)
{
iic_start();
iic_send_byte(AT24C02_ADDR+0);
if(!test_ack())
{
return(0);
}
iic_send_byte(ADDR);
if(!test_ack())
{
return(0);
}
iic_send_byte(DAT);
if(!test_ack())
{
return(0);
}
iic_stop();
return(1);
}
unsigned char AT24CXX_ReceiveData(unsigned char ADDR)
{
unsigned char DAT;
iic_start();
iic_send_byte(AT24C02_ADDR+0);
if (!test_ack())
{
return(0);
}
iic_send_byte(ADDR);
master_ack(0);
iic_start();
iic_send_byte(AT24C02_ADDR+1);
if (!test_ack())
{
return(0);
}
DAT = iic_read_byte();
master_ack(0);
iic_stop();
return(DAT);
}
|
-
-
IIC工程.7z
2020-5-7 16:09 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
175.33 KB, 下載次數(shù): 16, 下載積分: 黑幣 -5
STM32F1程序
|