找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1593|回复: 1
收起左侧

STM32的IIC通讯协议示例工程AT24CXX

[复制链接]
ID:304877 发表于 2020-5-7 11:16 | 显示全部楼层 |阅读模式
说明:本例程实验STM32F103ZET6与AT24C02通讯,初次编写,欢迎大佬批正。
接口如下:
        SDA  PA5
        SCL   PA4
        LED   PE5
现象:复写成功,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;      //设置B3B4输出  50MHZ模式
GPIOA->ODR |= (1<<5)|(1<<4);    //设置为高电平
}
/*端口输入模式*/
void sda_i(void)
{
  GPIOA->CRL &= ~(0xf0 << 4*4) ;  //清除CRL第20到23位值
GPIOA->CRL |= 0x80 << 4*4;      //设置B3B4输入  默认上拉 50MHz模式
GPIOA->ODR |= (1<<5);    //设置为上拉模式
}
/*端口输出模式*/
void sda_o(void)
{
  GPIOA->CRL &= ~(0xf0 << 4*4) ;  //清除CRL第20到23位值
GPIOA->CRL |= 0x30 << 4*4;      //设置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
}
/*主机发送应答*/
void master_ack(char i)//0为不应答
{
  SDA_OUT
  SCL_L
IICDELAY

if(i)
SDA_L
else
SDA_H

IICDELAY
  SCL_H
IICDELAY
SDA_IN
  SCL_L
}
/*检测从机应答*/
char test_ack(void)
{
  SDA_IN
SCL_H
IICDELAY
if(SDA)     //如果高电平   非应答
{
SCL_L
IICDELAY
iic_stop();
return(0);
}
else        //低电平    应答
{
SCL_L
IICDELAY
return(1);
}
}
/*发送一个字节*/
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
}
/*读一个字节*/
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();
}
/*发送数据*/
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

175.33 KB, 下载次数: 16, 下载积分: 黑币 -5

STM32F1程序

回复

使用道具 举报

ID:304877 发表于 2020-5-11 06:41 来自手机 | 显示全部楼层
已经实验成功
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表