標(biāo)題: 感覺(jué)一個(gè)人學(xué)單片機(jī)好難,學(xué)到i2c總線卡住了 [打印本頁(yè)]

作者: a66301208a    時(shí)間: 2018-11-30 00:36
標(biāo)題: 感覺(jué)一個(gè)人學(xué)單片機(jī)好難,學(xué)到i2c總線卡住了
感覺(jué)一個(gè)人學(xué)好難,學(xué)到i2c總線卡住了,程序沒(méi)問(wèn)題,下到開發(fā)版上確不行,找了半天找不出問(wèn)題,要是有個(gè)師傅帶就好了!
作者: jeffwang2011    時(shí)間: 2018-11-30 08:24
還有一句話,師傅領(lǐng)進(jìn)門,修行在個(gè)人。

樓主已經(jīng)進(jìn)門,事在人為了,我也沒(méi)師傅帶,都是自己摸索的。。。
作者: Y_G_G    時(shí)間: 2018-11-30 08:36
IIC的關(guān)鍵在于應(yīng)答,你可以在每個(gè)時(shí)鐘后面加上一個(gè)取反的IO,然后接上LED,讀寫的時(shí)候可以從LED閃動(dòng)中看到讀寫的情況,或者是先完全的抄別人的程序先來(lái)驗(yàn)證一下你硬件電路有沒(méi)有問(wèn)題,確定硬件電路沒(méi)有問(wèn)題了再去測(cè)試自己的程序

作者: wushiye54    時(shí)間: 2018-11-30 08:49
單步調(diào)試看看,大家都是這樣過(guò)來(lái)的。
作者: mrhan1992    時(shí)間: 2018-11-30 08:54
可以找一些技術(shù)群或者在論壇里留言問(wèn)問(wèn)看,興許會(huì)找到解決的辦法
作者: HC6800-ES-V2.0    時(shí)間: 2018-11-30 08:57
找個(gè)例子看看嘛,有時(shí)候自己卡住了不知道,看看別人的成功例子,就可以打開思路了。
共享一個(gè):
IIC.c文件內(nèi)容:
#include"i2c.h"
/*******************************************************************************
* 函數(shù)名         : Delay1us()
* 函數(shù)功能                   : 延時(shí)
* 輸入           : 無(wú)
* 輸出                  : 無(wú)
*******************************************************************************/

void Delay10us()
{
        unsigned char a,b;
        for(b=1;b>0;b--)
                for(a=2;a>0;a--);

}
/*******************************************************************************
* 函數(shù)名         : I2cStart()
* 函數(shù)功能                   : 起始信號(hào):在SCL時(shí)鐘信號(hào)在高電平期間SDA信號(hào)產(chǎn)生一個(gè)下降沿
* 輸入           : 無(wú)
* 輸出                  : 無(wú)
* 備注           : 起始之后SDA和SCL都為0
*******************************************************************************/

void I2cStart()
{
        SDA=1;
        Delay10us();
        SCL=1;
        Delay10us();//建立時(shí)間是SDA保持時(shí)間>4.7us
        SDA=0;
        Delay10us();//保持時(shí)間是>4us
        SCL=0;                       
        Delay10us();               
}
/*******************************************************************************
* 函數(shù)名         : I2cStop()
* 函數(shù)功能                   : 終止信號(hào):在SCL時(shí)鐘信號(hào)高電平期間SDA信號(hào)產(chǎn)生一個(gè)上升沿
* 輸入           : 無(wú)
* 輸出                  : 無(wú)
* 備注           : 結(jié)束之后保持SDA和SCL都為1;表示總線空閑
*******************************************************************************/

void I2cStop()
{
        SDA=0;
        Delay10us();
        SCL=1;
        Delay10us();//建立時(shí)間大于4.7us
        SDA=1;
        Delay10us();               
}
/*******************************************************************************
* 函數(shù)名         : I2cSendByte(unsigned char num)
* 函數(shù)功能                   : 通過(guò)I2C發(fā)送一個(gè)字節(jié)。在SCL時(shí)鐘信號(hào)高電平期間,保持發(fā)送信號(hào)SDA保持穩(wěn)定
* 輸入           : num
* 輸出                  : 0或1。發(fā)送成功返回1,發(fā)送失敗返回0
* 備注           : 發(fā)送完一個(gè)字節(jié)SCL=0,SDA=1
*******************************************************************************/

unsigned char I2cSendByte(unsigned char dat)
{
        unsigned char a=0,b=0;//最大255,一個(gè)機(jī)器周期為1us,最大延時(shí)255us。               
        for(a=0;a<8;a++)//要發(fā)送8位,從最高位開始
        {
                SDA=dat>>7;         //起始信號(hào)之后SCL=0,所以可以直接改變SDA信號(hào)
                dat=dat<<1;
                Delay10us();
                SCL=1;
                Delay10us();//建立時(shí)間>4.7us
                SCL=0;
                Delay10us();//時(shí)間大于4us               
        }
        SDA=1;
        Delay10us();
        SCL=1;
        while(SDA)//等待應(yīng)答,也就是等待從設(shè)備把SDA拉低
        {
                b++;
                if(b>200)         //如果超過(guò)2000us沒(méi)有應(yīng)答發(fā)送失敗,或者為非應(yīng)答,表示接收結(jié)束
                {
                        SCL=0;
                        Delay10us();
                        return 0;
                }
        }
        SCL=0;
        Delay10us();
        return 1;               
}
/*******************************************************************************
* 函數(shù)名         : I2cReadByte()
* 函數(shù)功能                   : 使用I2c讀取一個(gè)字節(jié)
* 輸入           : 無(wú)
* 輸出                  : dat
* 備注           : 接收完一個(gè)字節(jié)SCL=0,SDA=1.
*******************************************************************************/

unsigned char I2cReadByte()
{
        unsigned char a=0,dat=0;
        SDA=1;                        //起始和發(fā)送一個(gè)字節(jié)之后SCL都是0
        Delay10us();
        for(a=0;a<8;a++)//接收8個(gè)字節(jié)
        {
                SCL=1;
                Delay10us();
                dat<<=1;
                dat|=SDA;
                Delay10us();
                SCL=0;
                Delay10us();
        }
        return dat;               
}
/*******************************************************************************
* 函數(shù)名         : I2cReadRespon()
* 函數(shù)功能                   : 接收完一個(gè)字節(jié)之后產(chǎn)生應(yīng)答,以便接著接收下一個(gè)字節(jié)
* 輸入           : 無(wú)
* 輸出                  : 無(wú)
* 備注           : 接收完一個(gè)字節(jié)SCL=0
*******************************************************************************/
//void I2cReadRespon()
//{
//        SDA=0;
//        Delay10us();
//        SDA=1;
//        Delay10us();
//}


IIC.h文件內(nèi)容:
#ifndef __I2C_H_
#define __I2C_H_

#include<reg51.h>
sbit SCL=P2^1;
sbit SDA=P2^0;

void I2cStart();
void I2cStop();
unsigned char I2cSendByte(unsigned char dat);
unsigned char I2cReadByte();
void I2cReadRespon();
#endif

作者: a1109170323    時(shí)間: 2018-11-30 09:20
多參照論壇里別人的設(shè)計(jì),慢慢來(lái)
作者: liujiaji8787    時(shí)間: 2018-11-30 09:35
多看看時(shí)序圖啊
作者: darkorblack    時(shí)間: 2018-11-30 10:12
有問(wèn)題要多嘗試自己動(dòng)手解決,慢慢的就會(huì)找到方法了,不要急,心急吃不了熱豆腐
作者: yousunny    時(shí)間: 2018-11-30 11:53
設(shè)計(jì)到相關(guān)協(xié)議的時(shí)候,一開始不要自己寫,因?yàn)橐话闳嘶旧鲜菍懖粊?lái)的。通常是,找一個(gè)大神寫的程序,參考他的,理解他的,然后自己再寫
作者: a66301208a    時(shí)間: 2018-11-30 16:58
謝謝大家,堅(jiān)持堅(jiān)持!
作者: 1337173140    時(shí)間: 2018-12-1 22:07
難免會(huì)出現(xiàn)這樣的問(wèn)題,我也是經(jīng)常會(huì)這樣,可以先仿真看一下,有時(shí)候不一定沒(méi)有錯(cuò)誤就能實(shí)現(xiàn)功能
作者: wenaochina    時(shí)間: 2018-12-2 00:06
我有相關(guān)資料
作者: a超人    時(shí)間: 2018-12-10 19:14
HC6800-ES-V2.0 發(fā)表于 2018-11-30 08:57
找個(gè)例子看看嘛,有時(shí)候自己卡住了不知道,看看別人的成功例子,就可以打開思路了。
共享一個(gè):
IIC.c文 ...

在哪里可以找到好的例子啊  感覺(jué)不是教材寫的一般還看不懂呢  你一般是在哪里看例子啊 給我說(shuō)說(shuō)吧  不要說(shuō)是百度啊
作者: zhan8665    時(shí)間: 2018-12-10 22:23
如果有相關(guān)不懂的問(wèn)題可以發(fā)到貼吧來(lái)問(wèn)問(wèn)大家討論一下
作者: tianqi911    時(shí)間: 2020-4-1 10:43
沒(méi)辦法的事情。只能默默忍耐。小公司很難有所謂的師傅的,而且一般上點(diǎn)年級(jí)的思維方式都是“教會(huì)徒弟餓死師傅”那種。不挖坑就算不錯(cuò)了。
作者: PDDDF    時(shí)間: 2020-4-1 16:36
看時(shí)序圖,會(huì)有點(diǎn)幫助的,我也是自己慢慢學(xué)的,有問(wèn)題上論壇,總會(huì)有人幫你
作者: 玲瓏骰子安紅豆    時(shí)間: 2020-4-2 11:00
我也是,自己學(xué)好辛苦,工作后專注力也下降了




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1