久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6163|回復: 2
收起左側

關于24c256的一些問題

[復制鏈接]
ID:238908 發表于 2018-6-28 09:29 | 顯示全部樓層 |閱讀模式
最近在調試24c256,出了點問題老是找不出毛病,就是對24C256寫數據的時候,前面有可能用得好好的,后面就突然數據開始錯位了
正常讀出來的數據應該是這樣的:1803041000030028130161
但是出現問題后讀出來的數據都是:
0627110546002812016100
0627110712000004000000
0627150724000004000000
(我是每次寫入16字節的數據,前11個字節是有效,后5個是補零)
我每次只寫16個字節的數據,寫入的間隔時間也不短,出問題是應該是地址錯位了。
但是程序里面是沒有問題的。所以想請問大神們,有什么原因可能導致我出現這個問題,謝謝

下面我貼下我的程序,請幫忙看下
這是main里使用的:
        IIC_Transmit(0xA0,Wddr, &Savedata[0], 16);//往24C256寫入數據
           Delayms(400);


下面是24c256的子程序:
**************************************************************************************************************************/
/*
********************************************************
函數名稱:void AT24C256_Init(void)
函數功能:初始化IO口
********************************************************
*/
void AT24C256_Init(void)
{
    DDRE  |= 0xC0;
        PORTE |= 0xC0;
}
/*
********************************************************
函數名稱:static void IIC_delay(void)
函數功能:延時
********************************************************
*/
static void IIC_delay(void)
{
   asm("nop");
}

/*
********************************************************
函數名稱:static void IIC_delay(void)
函數功能:主機發送開始信號
********************************************************
*/
static void IIC_Start(void)
{
    MODE_OUT;
        
        SDA_H;
                asm("nop");

        SCL_H;
                asm("nop");
                asm("nop");
                asm("nop");

        SDA_L;
                asm("nop");
                asm("nop");
                asm("nop");
                asm("nop");

        SCL_L;
                asm("nop");
                asm("nop");

}


/*
********************************************************
函數名稱:static void IIC_Stop(void)
函數功能:主機發送結束信號
********************************************************
*/
static void IIC_Stop(void)
{
    MODE_OUT;

    SCL_L;
                asm("nop");
                asm("nop");

        SDA_L;
                asm("nop");
                asm("nop");

        SCL_H;
                asm("nop");
                asm("nop");
                asm("nop");
                asm("nop");

        SDA_H;
                asm("nop");
                asm("nop");
                asm("nop");
                asm("nop");


}

/*
********************************************************
函數名稱: static unsigned char IIC_ACK_Check(void)
函數功能: 主機成功發送一個字節數據后,AT24C256會發送一
           應答信號。
返回值  : 1    沒有應答信號,即從機沒有成功接收到數據
           0    有應答信號,即從機已接收到了數據
********************************************************
*/
static unsigned char IIC_ACK_Check(void)
{
    unsigned char Bitmun;
        
        MODE_IN;
        
    SCL_L;
                asm("nop");
                asm("nop");

        SDA_H;
                asm("nop");
                asm("nop");
        
        SCL_H;
                asm("nop");
                asm("nop");
                asm("nop");
                asm("nop");

        Bitmun = PINE;
        
        SCL_L;
                asm("nop");
                asm("nop");

        
        Bitmun =(Bitmun >> 7)&0x01;
        
        
    return Bitmun;
}

/*
********************************************************
函數名稱: static void IIC_NO_ACK(void)
函數功能: 主機發送一個字節數據后,
           不會檢測從機的應答信號
********************************************************
*/
static void IIC_NO_ACK(void)
{
    MODE_OUT;

    SCL_L;
            asm("nop");
                asm("nop");

        SDA_H;
                asm("nop");
                asm("nop");

        SCL_H;
                asm("nop");
                asm("nop");
                asm("nop");
                asm("nop");

        SCL_L;
                asm("nop");
                asm("nop");

}

/*
********************************************************
函數名稱: static void IIC_ACK_Creat(void)
函數功能: 主機向從機請求一個字節數據后,
           發送應答信號,告訴從機繼續發送數據。(連讀讀模式)
********************************************************
*/
static void IIC_ACK_Creat(void)
{
    MODE_OUT;

        SCL_L;
                asm("nop");
                asm("nop");

        SDA_L;
                asm("nop");
                asm("nop");

    SCL_H;
                asm("nop");
                asm("nop");
                asm("nop");
                asm("nop");

        SCL_L;
                asm("nop");
                asm("nop");

}

/*
********************************************************
函數名稱:  static void IIC_Send8Bit(unsigned char SendByte)
函數功能:  主機發送一個字節數據
********************************************************
*/
static void IIC_Send8Bit(unsigned char SendByte)
{
    char counter;
               
        MODE_OUT;
               
        SDA_L;
                asm("nop");
                asm("nop");
                asm("nop");

        for (counter = 8; counter >0; counter--)
        {
        SCL_L;
                asm("nop");
                asm("nop");

                        
            if (SendByte & 0x80)
                {
                    SDA_H;
                        asm("nop");
                }
                else
                {
            SDA_L;
                        asm("nop");
                        asm("nop");
                }
               
                SCL_H;
                        asm("nop");

                SendByte = SendByte << 1;

        }
SCL_L;
                asm("nop");
                asm("nop");
}

/*
********************************************************
函數名稱:   static unsigned char IIC_Receive8Bit(void)
函數功能:   主機接收一個字節數據
********************************************************
*/
static unsigned char IIC_Receive8Bit(void)
{
    char counter;
    unsigned char ReceiveByte=0;
        unsigned char IOstatus=0;
        
        MODE_IN;
        
        SCL_L;
                asm("nop");
                asm("nop");

    SDA_H;
                asm("nop");
                asm("nop");

        
    for (counter = 8; counter > 0; counter--)
        {
        SCL_L;
                        asm("nop");
                        asm("nop");

                SCL_H;
                        asm("nop");
                        asm("nop");

                IOstatus = PINE;
               
            ReceiveByte  = ReceiveByte<<1;
        ReceiveByte        |= (IOstatus >>7)& 0x01;
        }
        SCL_L;
        return ReceiveByte;
}
/*
********************************************************
函數名稱:   char IIC_Transmit(unsigned char lcv_device,unsigned int liv_addr,unsigned char *lcv_pdata, char counter)
函數功能:   主機往指定地址發送數據
             unsigned char lcv_device    從機地址
                         unsigned int liv_addr       從機內部存儲地址
                         unsigned char *lcv_pdata    發送數據緩存區
                         char counter                發送多少個數據
                        
返回值 :    1    寫入數據失敗
             0    寫入成功

                         注: AT24C256在連續讀寫過程中,會自動增加地址,但是不會自動跳轉到下一頁,
                              所以要注意連續讀寫過程中不要超過頁的存儲空間,避免最先存儲的數據被覆蓋從而導致
                                  數據丟失。
********************************************************
*/
char IIC_Transmit(unsigned char lcv_device,unsigned int liv_addr,unsigned char *lcv_pdata, char counter)
{
    IIC_Start();
        
        /* 發送從機地址 */
        IIC_Send8Bit(lcv_device);
        if ( IIC_ACK_Check() ) //調用函數char IIC_ACK_Check(void),沒有從機回應則結束本次發送。
        {
            IIC_Stop();
        return FAIL;
        }

        /* 發送內存地址*/
    IIC_Send8Bit((unsigned char)(liv_addr >> 8) & 0x0FF);  //高八位
        if ( IIC_ACK_Check()) //調用函數char IIC_ACK_Check(void),沒有從機回應則結束本次發送。
    {
        IIC_Stop();
                return FAIL;
    }        
    IIC_Send8Bit((unsigned char)((liv_addr)&0x0FF));  //低八位
        if ( IIC_ACK_Check()) //調用函數char IIC_ACK_Check(void),沒有從機回應則結束本次發送。
        {
        IIC_Stop();
                return FAIL;
        }        
               
        /* 發送數據 */
    for(;counter > 0;counter-- )               
    {
        IIC_Send8Bit(*lcv_pdata);
            if ( IIC_ACK_Check()) //調用函數char IIC_ACK_Check(void),沒有從機回應則結束本次發送。
                {
                    IIC_Stop();
                    return FAIL;
                }        
            lcv_pdata++;
    }
               

        IIC_Stop();
               
        return SUCCEED;
}

/*
********************************************************
函數名稱 :  char IIC_Receive(unsigned char lcv_device, unsigned int liv_addr, unsigned char *lcv_pdata, char counter)
函數功能 :  主機接收數據
             unsigned char lcv_device    從機地址
                         unsigned int liv_addr       從機內部存儲地址
                         unsigned char *lcv_pdata    發送數據緩存區
                         char counter                發送多少個數據

返回值 :    1      讀數據失敗
             0      讀成功
                        
                         注: AT24C256在連續讀寫過程中,會自動增加地址,但是不會自動跳轉到下一頁,
                              所以要注意連續讀寫過程中不要超過頁的存儲空間,避免最先存儲的數據被覆蓋從而導致
                                  數據丟失。               
                                 
                                  讀模式:  需要先配置為寫模式,然后才能改為讀模式
********************************************************
*/
char IIC_Receive(unsigned char lcv_device, unsigned int liv_addr, unsigned char *lcv_pdata, char counter)
{

        /* 先將從機配置為寫模式 */
    IIC_Start();
        /* 發送從機地址 */
    IIC_Send8Bit(lcv_device);
        if ( IIC_ACK_Check())//調用函數char IIC_ACK_Check(void),沒有從機回應則結束本次發送。
        {
        IIC_Stop();
        return FAIL;
        }
               
           /*    發送內存地址   */
    IIC_Send8Bit((unsigned char)((liv_addr >> 8)&0x0FF));
        if ( IIC_ACK_Check()) //調用函數char IIC_ACK_Check(void),沒有從機回應則結束本次發送。
        {
            IIC_Stop();
                return FAIL;
        }        
    IIC_Send8Bit((unsigned char)((liv_addr)&0x0FF));               
        if ( IIC_ACK_Check()) //調用函數char IIC_ACK_Check(void),沒有從機回應則結束本次發送。
        {
            IIC_Stop();
                return FAIL;
        }        
        
        
            /* 然后將從機配置為寫模式 */        
            IIC_Start();
        /* 發送從機地址 */
            IIC_Send8Bit(lcv_device+1);
            if ( IIC_ACK_Check()) ////調用函數char IIC_ACK_Check(void),沒有從機回應則結束本次發送。
            {
            IIC_Stop();
                    return FAIL;
        }        
               
        for( ; counter > 0; )
        {

        *lcv_pdata = IIC_Receive8Bit();
            counter--;
            if ( counter >0)
                {
                    IIC_ACK_Creat();
                    lcv_pdata++ ;
                }
               
        }
        
        IIC_NO_ACK();
        IIC_Stop();
        
        return SUCCEED;
}

回復

使用道具 舉報

ID:238908 發表于 2018-6-29 09:15 | 顯示全部樓層
能不能有大佬幫幫忙
回復

使用道具 舉報

ID:373388 發表于 2018-10-27 13:29 | 顯示全部樓層
return SUCCEED;之前加個5ms的延時;另外,24lc256 連續只能寫1頁,不能跨頁寫,比如:地址0-15為一頁,地址16-31為一頁;地址只能是0開始;或者地址16開始連續寫16字節;不能是地址1-15,17-31開始連續寫16個字節的;
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产人免费人成免费视频 | 欧美日韩国产免费 | 精品国产乱码久久久久久丨区2区 | 中文字幕在线第二页 | 久久综合888 | 日韩2020狼一二三 | 在线观看中文字幕dvd播放 | 日韩成人 | 成年免费在线观看 | 午夜小视频在线播放 | 一区二区三区欧美在线观看 | 国产精品久久一区二区三区 | 国产高清精品一区二区三区 | 超碰最新在线 | 精品国产1区2区3区 一区二区手机在线 | 亚洲第一视频网 | 黄色网址在线播放 | 欧美成人综合 | 免费一区 | 国产精品久久久亚洲 | 国产精品久久久久久久久久 | 亚洲国产网址 | 日韩在线成人 | 91精品国产91久久久久青草 | 一区二区三区网站 | 免费一区二区 | 欧美一级二级三级 | 91精品国产91久久久久久三级 | 欧美又大粗又爽又黄大片视频 | 国产成人高清 | 国产精品久久久久久久久 | 国产精品久久久久无码av | 欧美日日 | 狠狠干美女 | 亚洲va在线va天堂va狼色在线 | 国产欧美日韩一区二区三区 | 国产一区二区三区视频在线观看 | 欧美精品一区二区三区蜜桃视频 | 中文字幕精品视频在线观看 | 久久久久久影院 | 国产成人免费视频 |