OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2347|回复: 2

IIC实验,液晶显示屏显示检测不到AT24C02,卡在了第一步

[复制链接]

40

主题

137

帖子

0

精华

高级会员

Rank: 4

积分
579
金钱
579
注册时间
2019-8-4
在线时间
187 小时
发表于 2019-10-23 15:45:42 | 显示全部楼层 |阅读模式
10金钱
仿写的实验程序检测不到AT24C02芯片,请大神指教IIC程序
#include "myIIC.h"
#include "delay.h"

void IIC_Init (void)
{
         GPIO_InitTypeDef GPIO_InitStructure;
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
       
         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
         GPIO_SetBits(GPIOB, GPIO_Pin_6| GPIO_Pin_7);       
         GPIO_Init(GPIOB,&GPIO_InitStructure);
}

void IIC_Start (void)
{
    SDA_OUT();
        IIC_SDA =1;
        IIC_SCL=1;
        delay_us(4);
        IIC_SDA=0;
        delay_us(4);
        IIC_SCL=0;
}

void IIC_Stop (void)
{
        IIC_SCL=0;
    SDA_OUT();
        IIC_SDA =0;
       
        delay_us(4);
        IIC_SCL=1;
        IIC_SDA=1;
        delay_us(4);
}

void IIC_Ack (void)
{
    SDA_OUT();
        IIC_SCL=0;
        IIC_SDA=0;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}

void IIC_NAck(void)
{
   SDA_OUT();
        IIC_SCL=0;
        IIC_SDA =1;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}

u8 IIC_Wait_Ack (void)
{
u8 i=0;
        SDA_IN();
        IIC_SCL=1;delay_us(1);
        IIC_SDA =1;delay_us(1);
                while(READ_SDA)
                {
                i++;
                if(i>250)  { IIC_Stop(); return 1;}
                }
        IIC_SCL=0;
return 0;
}

void IIC_Send_Byte(u8 txd)
{
         u8 i;
         SDA_OUT();
        for(i=0;i<8;i++)//低位开始
        {
                IIC_SCL=0;
                IIC_SDA=(txd&0X80)>>7;
                txd<<=1;delay_us(2);
                IIC_SCL=1;delay_us(2);
                IIC_SCL=0;delay_us(2);
        }
}

u8 IIC_Read_Byte(unsigned char ack)
{
        //u8 IIC_Read_Byte(unsigned char ack);
         char i;
         char receive=0;
         SDA_IN();
         for(i=0;i<8;i++)
         {
                IIC_SCL=0;
                delay_us(2);
                IIC_SCL=1;
                if(READ_SDA)receive++;
                receive<<=1;
                 delay_us(2);
   }
        if(ack) IIC_Ack();
        else IIC_NAck();       
        return receive;
        }

AT24C02程序

#include "24cxx.h"
#include "delay.h"
void AT24CXX_Init(void)
{
        IIC_Init ();
}


void AT24CXX_WriteOneByte(u16 WriteAddr,u8 Data)
{
        IIC_Start();
        if(EE_TYPE> AT24C16)
        {
                IIC_Send_Byte(0XA0);
                IIC_Wait_Ack();
                IIC_Send_Byte(WriteAddr>>8);
        }
        else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));//一个地址写八bit位
        IIC_Wait_Ack();
        IIC_Send_Byte(WriteAddr%256);
   IIC_Wait_Ack();
        IIC_Send_Byte(Data);
         IIC_Wait_Ack();
        IIC_Stop();
        delay_us(10);
}

void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
{
        u8 i;
        for(i=0;i<Len;i++)
        {
                AT24CXX_WriteOneByte(WriteAddr+i,(DataToWrite>>(8*i))&0XFF);
        }
}
               
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
        char receive=0;
        IIC_Start();
        if(EE_TYPE> AT24C16)
        {
                IIC_Send_Byte(0XA0);
                IIC_Wait_Ack();
                IIC_Send_Byte(ReadAddr>>8);
                IIC_Wait_Ack();
        }
        else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));
        IIC_Wait_Ack();
        IIC_Send_Byte(ReadAddr%256);
   IIC_Wait_Ack();
                IIC_Start();
        IIC_Send_Byte(0XA1);
        IIC_Wait_Ack();
        receive=IIC_Read_Byte(0);
                 IIC_Stop();
        return receive;
}

u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
{
        u8 i;
        u32 receive=0;
                for(i=1;i<=Len;i++)
        {
                receive<<=8;
                receive+=AT24CXX_ReadOneByte(ReadAddr+Len-i);
        }
        return receive;
}

u8 AT24CXX_Check(void)
{
        u8 receive;
        receive=AT24CXX_ReadOneByte(255);
        if (receive==0X55) return 0;
        else
        {
                AT24CXX_WriteOneByte(255,0X55);
                receive=AT24CXX_ReadOneByte(255);
                if (receive==0X55) return 0;
        }
  return 1;       
}

void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
{
        while(NumToRead)
        {
          *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
                NumToRead--;
        }       
}
       
void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
        while(NumToWrite--)
        {
          AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
                pBuffer++;
                WriteAddr++;
        }       
}






AT24C02检测不到

AT24C02检测不到

最佳答案

查看完整内容[请看2#楼]

已经知道了,这两行代码顺序倒一下,否则最高位会被移出去 if(READ_SDA)receive++; receive
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

40

主题

137

帖子

0

精华

高级会员

Rank: 4

积分
579
金钱
579
注册时间
2019-8-4
在线时间
187 小时
 楼主| 发表于 2019-10-23 15:45:43 | 显示全部楼层
已经知道了,这两行代码顺序倒一下,否则最高位会被移出去
if(READ_SDA)receive++;
                receive<<=1;
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10570
金钱
10570
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-10-23 17:34:23 | 显示全部楼层
板子上不能占用与24C02连接的IIC相关引脚
你对比下你IIC初始化程序和例程是否一致
一致的话再去仿真看下代码执行到AT24CXX_Check()的哪行程序就执行不了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-2 20:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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