STM32F407 检测不到AT24C06..

2019-07-20 16:28发布

代码完全移植原子哥的。。只改了IO口..实际检测不到AT24C06,,但是确定芯片是好的,


#include "myiic.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////         
//±¾3ìDòÖ»1©Ñ§Ï°ê1óã¬Î′¾-×÷ÕßDí¿é£¬2»μÃóÃóúÆäËüèÎoÎóÃí¾
//ALIENTEK STM32F407¿a·¢°å
//IIC Çy¶ˉ′úÂë          
//ÕyμãÔ-×ó@ALIENTEK
//¼¼êõÂÛì3:www.openedv.com
//′′½¨èÕÆú:2014/5/6
//°æ±¾£oV1.0
//°æè¨ËùóD£¬μá°æ±Ø¾¿¡£
//Copyright(C) 1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾ 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////        
/////////////////////////////////////////////////////////
//IO·½ÏòéèÖÃ
#define SDA_IN()  {GPIOB->MODER&=~(3<<(3*2));GPIOB->MODER|=0<<3*2;}        //PB9ê&#228;è&#235;&#196;£ê&#189;
#define SDA_OUT() {GPIOB->MODER&=~(3<<(3*2));GPIOB->MODER|=1<<3*2;} //PB9ê&#228;3&#246;&#196;£ê&#189;
//IO2ù×÷oˉêy         
#define IIC_SCL    PCout(2) //SCL
#define IIC_SDA    PCout(3) //SDA         
#define READ_SDA   PCin(3)  //ê&#228;è&#235;SDA
/////////////////////////////////////
//3&#245;ê&#188;&#187;ˉIIC
void IIC_Init(void)
{                       
  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//ê1&#196;üGPIOBê±&#214;ó

  //GPIOB8,B93&#245;ê&#188;&#187;ˉéè&#214;&#195;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//&#198;&#213;í¨ê&#228;3&#246;&#196;£ê&#189;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//í&#198;íìê&#228;3&#246;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//é&#207;à-
  GPIO_Init(GPIOC, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉ
        IIC_SCL=1;
        IIC_SDA=1;
}
//2úéúIIC&#198;eê&#188;D&#197;o&#197;
void IIC_Start(void)
{
        SDA_OUT();     //sda&#207;&#223;ê&#228;3&#246;
        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;//&#199;ˉ×&#161;I2C×ü&#207;&#223;£&#172;×&#188;±&#184;·¢&#203;í&#187;ò&#189;óê&#213;êy&#190;Y
}          
//2úéúIICí£&#214;1D&#197;o&#197;
void IIC_Stop(void)
{
        SDA_OUT();//sda&#207;&#223;ê&#228;3&#246;
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC_SCL=1;
        IIC_SDA=1;//·¢&#203;íI2C×ü&#207;&#223;&#189;áê&#248;D&#197;o&#197;
        delay_us(4);                                                                  
}
//μè′yó|′eD&#197;o&#197;μ&#189;à′
//·μ&#187;&#216;&#214;μ£o1£&#172;&#189;óê&#213;ó|′e꧰ü
//        0£&#172;&#189;óê&#213;ó|′e3é1|
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN();      //SDAéè&#214;&#195;&#206;aê&#228;è&#235;  
        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;//ê±&#214;óê&#228;3&#246;0           
        return 0;  
}
//2úéúACKó|′e
void IIC_Ack(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=0;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}
//2&#187;2úéúACKó|′e                    
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·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú
//·μ&#187;&#216;′ó&#187;úóD&#206;Tó|′e
//1£&#172;óDó|′e
//0£&#172;&#206;Tó|′e                          
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
        SDA_OUT();             
    IIC_SCL=0;//à-μíê±&#214;ó&#191;aê&#188;êy&#190;Y′&#171;ê&#228;
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1;           
                delay_us(2);   //&#182;&#212;TEA5767&#213;aèy&#184;&#246;&#209;óê±&#182;&#188;ê&#199;±&#216;D&#235;μ&#196;
                IIC_SCL=1;
                delay_us(2);
                IIC_SCL=0;       
                delay_us(2);
    }         
}             
//&#182;á1&#184;&#246;×&#214;&#189;ú£&#172;ack=1ê±£&#172;·¢&#203;íACK£&#172;ack=0£&#172;·¢&#203;ínACK   
u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();//SDAéè&#214;&#195;&#206;aê&#228;è&#235;
    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();//·¢&#203;ínACK
    else
        IIC_Ack(); //·¢&#203;íACK   
    return receive;
}




#include "24cxx.h"
#include "delay.h"                                  
//////////////////////////////////////////////////////////////////////////////////         
//±&#190;3ìDò&#214;&#187;1&#169;&#209;§&#207;°ê1ó&#195;£&#172;&#206;′&#190;-×÷&#213;&#223;Dí&#191;é£&#172;2&#187;μ&#195;ó&#195;óú&#198;&#228;&#203;üè&#206;o&#206;ó&#195;í&#190;
//ALIENTEK STM32F407&#191;a·¢°&#229;
//24CXX &#199;y&#182;ˉ′ú&#194;&#235;          
//&#213;yμ&#227;&#212;-×ó@ALIENTEK
//&#188;&#188;ê&#245;&#194;&#219;ì3:www.openedv.com
//′′&#189;¨è&#213;&#198;ú:2014/5/6
//°&#230;±&#190;£oV1.0
//°&#230;è¨&#203;ùóD£&#172;μá°&#230;±&#216;&#190;&#191;&#161;£
//Copyright(C) 1&#227;&#214;YêDD&#199;òíμ&#231;×ó&#191;&#198;&#188;&#188;óD&#207;T1&#171;&#203;&#190; 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////        

//3&#245;ê&#188;&#187;ˉIIC&#189;ó&#191;ú
void AT24CXX_Init(void)
{
        IIC_Init();//IIC3&#245;ê&#188;&#187;ˉ
}
//&#212;úAT24CXX&#214;&#184;&#182;¨μ&#216;&#214;·&#182;á3&#246;ò&#187;&#184;&#246;êy&#190;Y
//ReadAddr:&#191;aê&#188;&#182;áêyμ&#196;μ&#216;&#214;·  
//·μ&#187;&#216;&#214;μ  :&#182;áμ&#189;μ&#196;êy&#190;Y
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                                  
        u8 temp=0;                                                                                                                                                               
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);           //·¢&#203;íD′&#195;üá&#238;
                IIC_Wait_Ack();
                IIC_Send_Byte(ReadAddr>>8);//·¢&#203;í&#184;&#223;μ&#216;&#214;·            
        }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //·¢&#203;í&#198;÷&#188;tμ&#216;&#214;·0XA0,D′êy&#190;Y           
        IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);   //·¢&#203;íμíμ&#216;&#214;·
        IIC_Wait_Ack();            
        IIC_Start();                     
        IIC_Send_Byte(0XA1);           //&#189;&#248;è&#235;&#189;óê&#213;&#196;£ê&#189;                          
        IIC_Wait_Ack();         
    temp=IIC_Read_Byte(0);                  
    IIC_Stop();//2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t            
        return temp;
}
//&#212;úAT24CXX&#214;&#184;&#182;¨μ&#216;&#214;·D′è&#235;ò&#187;&#184;&#246;êy&#190;Y
//WriteAddr  ′è&#235;êy&#190;Yμ&#196;&#196;&#191;μ&#196;μ&#216;&#214;·   
//DataToWrite:òaD′è&#235;μ&#196;êy&#190;Y
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                                                                                                                                                                                          
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);            //·¢&#203;íD′&#195;üá&#238;
                IIC_Wait_Ack();
                IIC_Send_Byte(WriteAddr>>8);//·¢&#203;í&#184;&#223;μ&#216;&#214;·          
        }else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //·¢&#203;í&#198;÷&#188;tμ&#216;&#214;·0XA0,D′êy&#190;Y          
        IIC_Wait_Ack();          
    IIC_Send_Byte(WriteAddr%256);   //·¢&#203;íμíμ&#216;&#214;·
        IIC_Wait_Ack();                                                                                                              
        IIC_Send_Byte(DataToWrite);     //·¢&#203;í×&#214;&#189;ú                                                          
        IIC_Wait_Ack();                                
    IIC_Stop();//2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t
        delay_ms(10);         
}
//&#212;úAT24CXXà&#239;&#195;&#230;μ&#196;&#214;&#184;&#182;¨μ&#216;&#214;·&#191;aê&#188;D′è&#235;3¤&#182;è&#206;aLenμ&#196;êy&#190;Y
//&#184;&#195;oˉêyó&#195;óúD′è&#235;16bit&#187;ò&#213;&#223;32bitμ&#196;êy&#190;Y.
//WriteAddr  :&#191;aê&#188;D′è&#235;μ&#196;μ&#216;&#214;·  
//DataToWrite:êy&#190;Yêy×éê×μ&#216;&#214;·
//Len        :òaD′è&#235;êy&#190;Yμ&#196;3¤&#182;è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);
        }                                                                                                    
}

//&#212;úAT24CXXà&#239;&#195;&#230;μ&#196;&#214;&#184;&#182;¨μ&#216;&#214;·&#191;aê&#188;&#182;á3&#246;3¤&#182;è&#206;aLenμ&#196;êy&#190;Y
//&#184;&#195;oˉêyó&#195;óú&#182;á3&#246;16bit&#187;ò&#213;&#223;32bitμ&#196;êy&#190;Y.
//ReadAddr   :&#191;aê&#188;&#182;á3&#246;μ&#196;μ&#216;&#214;·
//·μ&#187;&#216;&#214;μ     :êy&#190;Y
//Len        :òa&#182;á3&#246;êy&#190;Yμ&#196;3¤&#182;è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;                                                                                                    
}
//&#188;ì2éAT24CXXê&#199;·&#241;&#213;y3£
//&#213;aà&#239;ó&#195;á&#203;24XXμ&#196;×&#238;oóò&#187;&#184;&#246;μ&#216;&#214;·(255)à′′&#230;′¢±ê&#214;&#190;×&#214;.
//è&#231;1&#251;ó&#195;&#198;&#228;&#203;&#251;24C&#207;μáD,&#213;a&#184;&#246;μ&#216;&#214;·òaDT&#184;&#196;
//·μ&#187;&#216;1:&#188;ì2a꧰ü
//·μ&#187;&#216;0:&#188;ì2a3é1|
u8 AT24CXX_Check(void)
{
        u8 temp;
        temp=AT24CXX_ReadOneByte(255);//±ü&#195;a&#195;&#191;′&#206;&#191;a&#187;ú&#182;&#188;D′AT24CXX                          
        if(temp==0X55)return 0;                  
        else//&#197;&#197;3yμúò&#187;′&#206;3&#245;ê&#188;&#187;ˉμ&#196;&#199;é&#191;&#246;
        {
                AT24CXX_WriteOneByte(255,0X55);
            temp=AT24CXX_ReadOneByte(255);          
                if(temp==0X55)return 0;
        }
        return 1;                                                                                          
}

//&#212;úAT24CXXà&#239;&#195;&#230;μ&#196;&#214;&#184;&#182;¨μ&#216;&#214;·&#191;aê&#188;&#182;á3&#246;&#214;&#184;&#182;¨&#184;&#246;êyμ&#196;êy&#190;Y
//ReadAddr :&#191;aê&#188;&#182;á3&#246;μ&#196;μ&#216;&#214;· &#182;&#212;24c02&#206;a0~255
//pBuffer  :êy&#190;Yêy×éê×μ&#216;&#214;·
//NumToRead:òa&#182;á3&#246;êy&#190;Yμ&#196;&#184;&#246;êy
void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
{
        while(NumToRead)
        {
                *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);       
                NumToRead--;
        }
}  
//&#212;úAT24CXXà&#239;&#195;&#230;μ&#196;&#214;&#184;&#182;¨μ&#216;&#214;·&#191;aê&#188;D′è&#235;&#214;&#184;&#182;¨&#184;&#246;êyμ&#196;êy&#190;Y
//WriteAddr :&#191;aê&#188;D′è&#235;μ&#196;μ&#216;&#214;· &#182;&#212;24c02&#206;a0~255
//pBuffer   :êy&#190;Yêy×éê×μ&#216;&#214;·
//NumToWrite:òaD′è&#235;êy&#190;Yμ&#196;&#184;&#246;êy
void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
        while(NumToWrite--)
        {
                AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
                WriteAddr++;
                pBuffer++;
        }
}



代码应该不会有问题啊。。。现在没有示波器,,不知道该怎么办了



0条回答

一周热门 更多>