找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 5062|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

感覺(jué)一個(gè)人學(xué)單片機(jī)好難,學(xué)到i2c總線卡住了

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:425921 發(fā)表于 2018-11-30 00:36 來(lái)自觸屏版 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
感覺(jué)一個(gè)人學(xué)好難,學(xué)到i2c總線卡住了,程序沒(méi)問(wèn)題,下到開發(fā)版上確不行,找了半天找不出問(wèn)題,要是有個(gè)師傅帶就好了!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:435470 發(fā)表于 2018-11-30 08:24 | 只看該作者
還有一句話,師傅領(lǐng)進(jìn)門,修行在個(gè)人。

樓主已經(jīng)進(jìn)門,事在人為了,我也沒(méi)師傅帶,都是自己摸索的。。。
回復(fù)

使用道具 舉報(bào)

板凳
ID:401564 發(fā)表于 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è)試自己的程序
回復(fù)

使用道具 舉報(bào)

地板
ID:280876 發(fā)表于 2018-11-30 08:49 | 只看該作者
單步調(diào)試看看,大家都是這樣過(guò)來(lái)的。
回復(fù)

使用道具 舉報(bào)

5#
ID:279667 發(fā)表于 2018-11-30 08:54 | 只看該作者
可以找一些技術(shù)群或者在論壇里留言問(wèn)問(wèn)看,興許會(huì)找到解決的辦法
回復(fù)

使用道具 舉報(bào)

6#
ID:164602 發(fā)表于 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
回復(fù)

使用道具 舉報(bào)

7#
ID:436261 發(fā)表于 2018-11-30 09:20 | 只看該作者
多參照論壇里別人的設(shè)計(jì),慢慢來(lái)
回復(fù)

使用道具 舉報(bào)

8#
ID:436305 發(fā)表于 2018-11-30 09:35 | 只看該作者
多看看時(shí)序圖啊
回復(fù)

使用道具 舉報(bào)

9#
ID:436314 發(fā)表于 2018-11-30 10:12 | 只看該作者
有問(wèn)題要多嘗試自己動(dòng)手解決,慢慢的就會(huì)找到方法了,不要急,心急吃不了熱豆腐
回復(fù)

使用道具 舉報(bào)

10#
ID:308437 發(fā)表于 2018-11-30 11:53 | 只看該作者
設(shè)計(jì)到相關(guān)協(xié)議的時(shí)候,一開始不要自己寫,因?yàn)橐话闳嘶旧鲜菍懖粊?lái)的。通常是,找一個(gè)大神寫的程序,參考他的,理解他的,然后自己再寫
回復(fù)

使用道具 舉報(bào)

11#
ID:425921 發(fā)表于 2018-11-30 16:58 來(lái)自觸屏版 | 只看該作者
謝謝大家,堅(jiān)持堅(jiān)持!
回復(fù)

使用道具 舉報(bào)

12#
ID:413080 發(fā)表于 2018-12-1 22:07 | 只看該作者
難免會(huì)出現(xiàn)這樣的問(wèn)題,我也是經(jīng)常會(huì)這樣,可以先仿真看一下,有時(shí)候不一定沒(méi)有錯(cuò)誤就能實(shí)現(xiàn)功能
回復(fù)

使用道具 舉報(bào)

13#
ID:437454 發(fā)表于 2018-12-2 00:06 | 只看該作者
我有相關(guān)資料
回復(fù)

使用道具 舉報(bào)

14#
ID:418482 發(fā)表于 2018-12-10 19:14 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2018-11-30 08:57
找個(gè)例子看看嘛,有時(shí)候自己卡住了不知道,看看別人的成功例子,就可以打開思路了。
共享一個(gè):
IIC.c文 ...

在哪里可以找到好的例子啊  感覺(jué)不是教材寫的一般還看不懂呢  你一般是在哪里看例子啊 給我說(shuō)說(shuō)吧  不要說(shuō)是百度啊
回復(fù)

使用道具 舉報(bào)

15#
ID:434820 發(fā)表于 2018-12-10 22:23 | 只看該作者
如果有相關(guān)不懂的問(wèn)題可以發(fā)到貼吧來(lái)問(wèn)問(wèn)大家討論一下
回復(fù)

使用道具 舉報(bào)

16#
ID:275111 發(fā)表于 2020-4-1 10:43 | 只看該作者
沒(méi)辦法的事情。只能默默忍耐。小公司很難有所謂的師傅的,而且一般上點(diǎn)年級(jí)的思維方式都是“教會(huì)徒弟餓死師傅”那種。不挖坑就算不錯(cuò)了。
回復(fù)

使用道具 舉報(bào)

17#
ID:601478 發(fā)表于 2020-4-1 16:36 | 只看該作者
看時(shí)序圖,會(huì)有點(diǎn)幫助的,我也是自己慢慢學(xué)的,有問(wèn)題上論壇,總會(huì)有人幫你
回復(fù)

使用道具 舉報(bào)

18#
ID:411833 發(fā)表于 2020-4-2 11:00 | 只看該作者
我也是,自己學(xué)好辛苦,工作后專注力也下降了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表