OpenEdv-开源电子网

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

为什么我这个直接就检测不到24C02

[复制链接]

3

主题

14

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-4-26
在线时间
0 小时
发表于 2015-7-8 12:54:20 | 显示全部楼层 |阅读模式
5金钱
我的为什么改了相应的引脚配置之后无法检测到相应的24C02芯片,若是不加检测芯片是否存在的话,只能读读出来的是255,而不能写。不知道怎么回事,我用的是原子的程序啊。大神能不能帮忙看看的呢  真心感谢
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"  
#include "key.h"
#include "exti.h" 

unsigned int count1=1234,v=1234,count2;
unsigned int i=0,j=0,k=0,l=0,qianwei,baiwei,shiwei,a=4,gewei,SIZE=4;//c代表电机转一圈走过的距离,a代表转盘一周所放磁铁数量,v代表及时速度
unsigned char table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
float c=2.05;//一圈走过的距离

#define AT24C01 127
#define AT24C02 255
#define AT24C04 511
#define AT24C08 1023
#define AT24C16 2047
#define AT24C32 4095
#define AT24C64    8191
#define AT24C128 16383
#define AT24C256 32767  
#define AT24C512 65535  
//本次使用的是24c02,所以定义EE_TYPE为AT24C02
#define EE_TYPE AT24C02

//IO方向设置
#define SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=0x00008000;}
#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=0x00003000;}

//IO操作函数  
#define IIC_SCL    Cout(10) //SCL
#define IIC_SDA    Cout(11) //SDA  
#define READ_SDA   PCin(11)  //输入SDA 

#define uchar unsigned char
u8 TEXT_Buffer[]={"3,7,6,3"};

void chufa1()
{
  qianwei = count1/1000; baiwei = (count1-qianwei*1000)/100; shiwei = (count1-qianwei*1000-baiwei*100)/10; gewei = (count1-qianwei*1000-baiwei*100)%10;
// TEXT_Buffer[0]=gewei; TEXT_Buffer[1]=shiwei; TEXT_Buffer[2]=baiwei; TEXT_Buffer[3]=qianwei;


}
void chufa2()
{   qianwei = count2/1000;
baiwei = (count2-qianwei*1000)/100;
shiwei = (count2-qianwei*1000-baiwei*100)/10;
gewei = (count2-qianwei*1000-baiwei*100)%10;
}
void chufa3()
{   qianwei = v/1000;
baiwei  = (v-qianwei*1000)/100;
shiwei  = (v-qianwei*1000-baiwei*100)/10;
gewei   = (v-qianwei*1000-baiwei*100)%10;
}


void dis(unsigned char temp)
{
   unsigned int i;
    delay_ms(1);
    for(i=0;i<8;i++)
    {
      SHCP1=0;//SH=0
      if((temp & 0x80) == 0x80)  {DS1=1;}//DS=1
      else                       {DS1=0;}//DS=0
      
      SHCP1=1;//SH=1
      temp<<=1;
      delay_us(10);
      SHCP1=0;//SH=0 
    }
    STCP1=0;//ST=0
    delay_us(5);
    STCP1=1;//ST=1
    delay_us(5);
    STCP1=0;//ST=0

}

void TIM3_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能    
  TIM3->ARR=arr;   //设定计数器自动重装值 
TIM3->SC=psc;   //预分频器设置
TIM3->DIER|=1<<0;   //允许更新中断
TIM3->CR1|=0x01;    //使能定时器3
  MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2  
}
void TIM2_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0; //TIM2时钟使能    
  TIM2->ARR=arr;   //设定计数器自动重装值 
TIM2->SC=psc;   //预分频器设置
TIM2->DIER|=1<<0;   //允许更新中断
TIM2->CR1|=0x01;    //使能定时器2
  MY_NVIC_Init(1,3,TIM2_IRQn,2);//抢占1,子优先级3,组2  
}
void TIM5_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<3; //TIM5时钟使能    
  TIM5->ARR=arr;   //设定计数器自动重装值 
TIM5->SC=psc;   //预分频器设置
TIM5->DIER|=1<<0;   //允许更新中断
TIM5->CR1|=0x01;    //使能定时器5
  MY_NVIC_Init(1,3,TIM5_IRQn,2);//抢占1,子优先级3,组2  
}


void dis_all()
{
   delay_ms(2);
   dis(table[qianwei]); if(qianwei == 0)  {WEIXUAN14=1;}  else {WEIXUAN14=0;delay_ms(2);WEIXUAN14=1;delay_ms(2); if(qianwei == 0)  {WEIXUAN14=1;} }
   dis(table[gewei]);   WEIXUAN13=0;delay_ms(2);WEIXUAN13=1;delay_ms(2);
   dis(table[shiwei]);   if(qianwei == 0 && baiwei == 0 && shiwei == 0)  {WEIXUAN14=1;WEIXUAN11=1;WEIXUAN12=1;}else {WEIXUAN12=0;delay_ms(2);WEIXUAN12=1;delay_ms(2);}
   dis(table[baiwei]);  if(qianwei == 0 && baiwei == 0)  {WEIXUAN14=1;WEIXUAN11=1;}else {WEIXUAN11=0;delay_ms(2);WEIXUAN11=1;delay_ms(2);}  
}








//初始化IIC
void IIC_Init(void)
{     
  RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟  
GPIOC->CRH&=0XFFF00FFF;//PC11/12 推挽输出
GPIOC->CRH|=0X00033000;   
GPIOC->ODR|=3<<11;     //PC11,12 输出高
}
//产生IIC起始信号
void IIC_Start(void)
{
SDA_OUT();     //sda线输出
IIC_SDA=1;    
IIC_SCL=1;
delay_us(4);
  IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
delay_us(4);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}  
//产生IIC停止信号
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL=0;
IIC_SDA=0;
  delay_us(4); 
IIC_SCL=1;//STOP:when CLK is high DATA change form low to high
  delay_us(4); 
IIC_SDA=1;//发送I2C总线结束信号  
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();      //SDA设置为输入  
IIC_SDA=1;delay_us(1);   
IIC_SCL=1;delay_us(1);  
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//时钟输出0   
return 0;  

//产生ACK应答
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//不产生ACK应答    
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}     
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答  
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
SDA_OUT();    
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1;  
delay_us(2);   //对TEA5767这三个延时都是必须的
IIC_SCL=1;
delay_us(2); 
IIC_SCL=0;
delay_us(2);
    }  
}    
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
{
        IIC_SCL=0; 
        delay_us(2);
IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
delay_us(1); 
    }  
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}

//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址  
//返回值 :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{  
u8 temp=0;        
    IIC_Start();  
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0);   //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址    
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据   
IIC_Wait_Ack(); 
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
IIC_Wait_Ack();    
IIC_Start();     
IIC_Send_Byte(0XA1);           //进入接收模式   
IIC_Wait_Ack();  
    temp=IIC_Read_Byte(0);   
    IIC_Stop();//产生一个停止条件    
return temp;
}
//在AT24CXX指定地址写入一个数据
//WriteAddr :写入数据的目的地址    
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{          
    IIC_Start();  
if(EE_TYPE>AT24C16)    //如果选择的芯片内存大小大于C16,则输出2个8bit,否则1个8bit
{
IIC_Send_Byte(0XA0);    //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);//发送高地址  
}else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据  
IIC_Wait_Ack();   
    IIC_Send_Byte(WriteAddr%256);   //发送低地址
IIC_Wait_Ack();     
IIC_Send_Byte(DataToWrite);     //发送字节   
IIC_Wait_Ack();         
    IIC_Stop(); //产生一个停止条件 
delay_ms(10); //对于EEPROM器件,每写一次要等待一段时间,否则写失败!  
}
//在AT24CXX里面的指定地址开始写入长度为Len的数据
//该函数用于写入16bit或者32bit的数据.
//WriteAddr :开始写入的地址  
//DataToWrite:数据数组首地址
//Len       :要写入数据的长度2,4
void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
{  
u8 t;
for(t=0;t<Len;t++)
{
AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
}    

//在AT24CXX里面的指定地址开始读出长度为Len的数据
//该函数用于读出16bit或者32bit的数据.
//ReadAddr   :开始读出的地址 
//返回值     :数据
//Len       :要读出数据的长度2,4
u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
{  
u8 t;
u32 temp=0;
for(t=0;t<Len;t++)
{
temp<<=8;
temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);   
}
return temp;    
}
//检查AT24CXX是否正常
//这里用了24XX的最后一个地址(255)来存储标志字.
//如果用其他24C系列,这个地址要修改
//返回1:检测失败
//返回0:检测成功
u8 AT24CXX_Check(void)
{
u8 temp;
temp=AT24CXX_ReadOneByte(255);//避免每次开机都写AT24CXX   
if(temp==0X55)return 0;   
else//排除第一次初始化的情况
{
AT24CXX_WriteOneByte(255,0X55);
   temp=AT24CXX_ReadOneByte(255);  
if(temp==0X55)return 0;
}
return 1;  
}

//在AT24CXX里面的指定地址开始读出指定个数的数据
//ReadAddr :开始读出的地址 对24c02为0~255
//pBuffer :数据数组首地址
//NumToRead:要读出数据的个数
void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
{
while(NumToRead)
{
*pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
NumToRead--;
}
}  
//在AT24CXX里面的指定地址开始写入指定个数的数据
//WriteAddr :开始写入的地址 对24c02为0~255
//pBuffer   :数据数组首地址
//NumToWrite:要写入数据的个数
void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
while(NumToWrite--)
{
AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
WriteAddr++;
pBuffer++;
}
}




int main(void)
{
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72);    //延时初始化
uart_init(72,9600); //串口初始化
TIM3_Int_Init(5000,7199);//10Khz的计数频率,计数到5000为500ms  
TIM2_Int_Init(5000,7199);//10Khz的计数频率,计数到5000为500ms  
TIM5_Int_Init(3000,7199);//10Khz的计数频率,计数到5000为300ms  
   IIC_Init();
KEY_Init();
EXTI_Init(); //外部中断初始化
//LED0=0; //点亮LED
chufa2();
dis_all();
TIM3->CR1 |= 0x01; //开定时器3
delay_ms (500);
// AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE);
// delay_ms (500);
// AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE);
//TIM3->CR1 &= 0xfe;//关闭定时器3
/* while(AT24CXX_Check())//检测不到24c02
{
delay_ms(500);
FMQ =!FMQ  ;//蜂鸣器使能
DENG3=!DENG3;
}
*/
// AT24CXX_Read(0,(u8*)TEXT_Buffer,SIZE);
AT24CXX_WriteOneByte(0,5);
delay_ms (100);
count1=   AT24CXX_ReadOneByte(0);
 


while(1)
{    
//设计一圈的长度是1m 放2个磁铁,也就是电机转一圈接受到两个中断信号,这时走过的路程为1m
v=count2;

chufa1();
//chufa3();
dis_all();
// write_add (2,count1);
DENG0 = 0;  DENG1 = 0; DENG2 = 0; DENG3 = 0;

if(j==0) //5秒钟一到,更新一下出现了几个脉冲信号,然后变换成速度
{
v=count2;
 count2=0;
}
while(j==0) { dis_all ();}
//


}



//定时器3中断服务程序  
void TIM3_IRQHandler(void)
{          
if(TIM3->SR&0X0001)//溢出中断
{
j++;     //当j=6的时候代表3s,这时更新速度。
if(j==10) 
{
j=0; 
// count2 ++;
}
}   
TIM3->SR&=~(1<<0);//清除中断标志位    
}

//定时器2中断服务程序  
void TIM2_IRQHandler(void)
{          
if(TIM2->SR&0X0001)//溢出中断
{
k++;              
}   
TIM2->SR&=~(1<<0);//清除中断标志位    
}

//定时器5中断服务程序  
void TIM5_IRQHandler(void)
{          
if(TIM5->SR&0X0001)//溢出中断
{
           
}   
TIM5->SR&=~(1<<0);//清除中断标志位 
  TIM5->CR1 &= 0xFFF0; //关闭定时器
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!

















正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13093
金钱
13093
注册时间
2012-11-26
在线时间
3810 小时
发表于 2015-7-8 13:11:21 | 显示全部楼层
你连IIC是什么东西都不知道,就瞎鸡巴乱改,呵呵。
学无止境
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-4-26
在线时间
0 小时
 楼主| 发表于 2015-7-8 15:45:33 | 显示全部楼层
回复【2楼】jermy_z:
---------------------------------
求赐教
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13093
金钱
13093
注册时间
2012-11-26
在线时间
3810 小时
发表于 2015-7-8 16:31:14 | 显示全部楼层
回复【3楼】猪头肉哇咔咔:
---------------------------------
看看资料  先看懂什么是模拟IIC吧
学无止境
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-4-26
在线时间
0 小时
 楼主| 发表于 2015-7-8 17:21:47 | 显示全部楼层
回复【4楼】jermy_z:
---------------------------------
我看了 又搞了好几次还是不行才来找人解答一下的  ,您能说的在明白一点么 谢谢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-7-8 23:02:44 | 显示全部楼层
看着没啥问题,建议用示波器看看scl,sda的波形。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-4-26
在线时间
0 小时
 楼主| 发表于 2015-7-9 10:29:24 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
我试了~~没检测到信号,是不是底层的IO配置不对,直接就检测不到芯片的存在
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-7-9 22:53:19 | 显示全部楼层
回复【7楼】猪头肉哇咔咔:
---------------------------------
SCL都没有信号?
我看配置貌似没问题啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-4-26
在线时间
0 小时
 楼主| 发表于 2015-7-12 08:37:12 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
是的呢,我只是改了一下引脚,相应的也配置好了,直接就检测不到芯片,而且管脚也检测不到信号呢,原子哥 求救啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-7-12 23:22:24 | 显示全部楼层
回复【9楼】猪头肉哇咔咔:
---------------------------------
管脚信号都没那就有问题,仿真一下看看,为啥 没信号吧
如果硬件有问题,就太郁闷了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2018-5-24
在线时间
5 小时
发表于 2018-5-24 17:47:48 | 显示全部楼层
这个问题解决了么?
回复

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2019-12-23 09:52:12 | 显示全部楼层
我的也是同样问题,EEPROM无论写的数据是什么。总是读出FF
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2019-12-24 17:57:22 | 显示全部楼层
我之前有遇到过同样的问题我后来换了另一个厂家的芯片就可以,然后我就没有管他了。我怀疑是这个芯片的问题,可能at24c02地址设置变了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-21 05:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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