欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 感覺一個人學單片機好難,學到i2c總線卡住了 [打印本頁]

作者: a66301208a    時間: 2018-11-30 00:36
標題: 感覺一個人學單片機好難,學到i2c總線卡住了
感覺一個人學好難,學到i2c總線卡住了,程序沒問題,下到開發版上確不行,找了半天找不出問題,要是有個師傅帶就好了!
作者: jeffwang2011    時間: 2018-11-30 08:24
還有一句話,師傅領進門,修行在個人。

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

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

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

}
/*******************************************************************************
* 函數名         : I2cStart()
* 函數功能                   : 起始信號:在SCL時鐘信號在高電平期間SDA信號產生一個下降沿
* 輸入           : 無
* 輸出                  : 無
* 備注           : 起始之后SDA和SCL都為0
*******************************************************************************/

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

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

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

unsigned char I2cReadByte()
{
        unsigned char a=0,dat=0;
        SDA=1;                        //起始和發送一個字節之后SCL都是0
        Delay10us();
        for(a=0;a<8;a++)//接收8個字節
        {
                SCL=1;
                Delay10us();
                dat<<=1;
                dat|=SDA;
                Delay10us();
                SCL=0;
                Delay10us();
        }
        return dat;               
}
/*******************************************************************************
* 函數名         : I2cReadRespon()
* 函數功能                   : 接收完一個字節之后產生應答,以便接著接收下一個字節
* 輸入           : 無
* 輸出                  : 無
* 備注           : 接收完一個字節SCL=0
*******************************************************************************/
//void I2cReadRespon()
//{
//        SDA=0;
//        Delay10us();
//        SDA=1;
//        Delay10us();
//}


IIC.h文件內容:
#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    時間: 2018-11-30 09:20
多參照論壇里別人的設計,慢慢來
作者: liujiaji8787    時間: 2018-11-30 09:35
多看看時序圖啊
作者: darkorblack    時間: 2018-11-30 10:12
有問題要多嘗試自己動手解決,慢慢的就會找到方法了,不要急,心急吃不了熱豆腐
作者: yousunny    時間: 2018-11-30 11:53
設計到相關協議的時候,一開始不要自己寫,因為一般人基本上是寫不來的。通常是,找一個大神寫的程序,參考他的,理解他的,然后自己再寫
作者: a66301208a    時間: 2018-11-30 16:58
謝謝大家,堅持堅持!
作者: 1337173140    時間: 2018-12-1 22:07
難免會出現這樣的問題,我也是經常會這樣,可以先仿真看一下,有時候不一定沒有錯誤就能實現功能
作者: wenaochina    時間: 2018-12-2 00:06
我有相關資料
作者: a超人    時間: 2018-12-10 19:14
HC6800-ES-V2.0 發表于 2018-11-30 08:57
找個例子看看嘛,有時候自己卡住了不知道,看看別人的成功例子,就可以打開思路了。
共享一個:
IIC.c文 ...

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




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