• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
  • slider image 488
  • slider image 491
:::


Browsing this Thread:   1 Anonymous Users






Re: I2C的問題(1個傳送,3個接收)
#10
新會員
新會員


查看用戶資訊
請問一下
傳送位址與資料時的ACK訊號為一個1伏的方波
這算正常嗎?
如果不正常,原因出在哪呢?

發表於: 2006/5/11 21:44
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: I2C的問題(1個傳送,3個接收)
#9
新會員
新會員


查看用戶資訊
大家安安~

小弟想問一下:
Master傳送一個byte時,
如果Slave因為資料遺失而沒收滿一個byte,
也就不會回傳確認訊號,
這時Master發個STOP,
Slave可以繼續接收資料而不會有任何影響嗎?

如果START和STOP的訊號也接收失敗,
這樣會影響資料接收吧?!

發表於: 2006/5/10 17:36
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: I2C的問題(1個傳送,3個接收)
#8
新會員
新會員


查看用戶資訊
我發現好像是電路的問題= =
我試過只傳給兩個PIC, 把第三個PIC從電路中拔除後
程式與硬體運作是很正常的, 不會出問題, 我敢拍胸脯保證
(給他跑了好一段時間還是正常到不行...)
當三個PIC同時插在電路板上後
唉...問題又發生了..
眼睜睜的看著閃爍的LED一個一個停住了
最後...PIC全部死當無一倖免...囧rz
即使把程式改成只傳Device1也是一樣
LED燈不是像跑馬燈一樣閃爍的很有規律
而是亂閃(會miss資料)...

請問要怎麼解決呢?
( 硬體電路 or... )

發表於: 2006/5/5 0:06
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: I2C的問題(1個傳送,3個接收)
#7
新會員
新會員


查看用戶資訊
傳送端是根據PIC18f452寫的
接收端則是PIC18f4431
我看波形圖比較奇怪的是傳送位址跟資料的時候
ACK的波形都是1,照理說應該只有傳送資料時的ACK為1才對
不過我怎麼改都還是1....

以下是傳送端與接收端的程式碼
( 一傳一時可以持續接收, 一傳三就傳一段時間就掛掉了= = )
//====================傳送端 只作傳送===========
#include <p18f452.h>
#include <delays.h>
#include <i2c.h>

int dy=0,i=0;
void F_Initial(void);
void F_I2C_START(void);
unsigned char F_I2C_WAIT(void);
unsigned char F_I2C_Send_Address(unsigned char);
void F_I2C_Send_Data(unsigned char);
void F_I2C_STOP(void);

void main(void)
{
    
unsigned char UC_I2C_Data1=0x00,      
                  
UC_I2C_Data2=0x10,      
                  
UC_I2C_Data3=0x04,      
                  
I2C_Device1=0x22,   //addr 0001 0010 
                  
I2C_Device2=0x18,   //addr 0001 1000
                  
I2C_Device3=0x60;   //addr 0110 0000
    
F_Initial();
    while(
1)
    {
                                
//====傳Device1
        
F_I2C_START();
        if( 
F_I2C_Send_Address(I2C_Device1 0XFE) )
        {
            
F_I2C_Send_Data(UC_I2C_Data1);    
        }
        
F_I2C_STOP();
        
i++;//for test
        //=================test============
        
UC_I2C_Data1++;
        if(
UC_I2C_Data1>0x0f)
            
UC_I2C_Data1=0x00;
        
Delay10KTCYx(1);//2.5ms
        //=================================
//====傳Device2
        
F_I2C_START();
        if( 
F_I2C_Send_Address(I2C_Device2 0XFE) )
        {
            
F_I2C_Send_Data(UC_I2C_Data2);    
        }
        
F_I2C_STOP();
        
i++;//for test
        //=================test============
        
UC_I2C_Data2+=16;
        if(
UC_I2C_Data2>0xff)
            
UC_I2C_Data2=0x10;
        
Delay10KTCYx(1);
        
//=================================
//====傳Device3
        
F_I2C_START();
        if( 
F_I2C_Send_Address(I2C_Device3 0XFE) )
        {
            
F_I2C_Send_Data(UC_I2C_Data3);    
        }
        
F_I2C_STOP();
        
i++;//for test
        //=================test============
        
UC_I2C_Data3+=4;
        if(
UC_I2C_Data3>0x3c)
            
UC_I2C_Data3=0x04;
        
Delay10KTCYx(1);
        
//=================================

    
}
}

void F_Initial(void)
{
    
TRISD 0;
    
LATD 0;
    
TRISCbits.TRISC3 0;
    
TRISCbits.TRISC4 0;
    
SSPSTATbits.SMP 1;
    
SSPSTATbits.CKE 0;
    
SSPCON1 0x38;
    
SSPADD 0x30;
}

void F_I2C_START(void)
{
    
unsigned char a;
    
SSPCON2bits.SEN 1;
    
a=F_I2C_WAIT();
    for(
dy=0;dy<3;dy++);    //緩衝時間
}

unsigned char F_I2C_WAIT(void)
{
    
int count=0;
    while (!
PIR1bits.SSPIF && count<5)    // when SSPIF is Hi
        
count++;
    
PIR1bits.SSPIF=0;                   
    if(
count==5)
        return (
0);
    else
        return (
1);
}

unsigned char F_I2C_Send_Address(unsigned char UC_Address)
{
    
int count=0;
    
unsigned char flag='1';
    
SSPBUF UC_Address;
    while(
SSPSTATbits.BF==1);
    while(
SSPCON2bits.ACKSTAT && count<)
        
count++;
    
flag F_I2C_WAIT();
    if(
flag=='0' || count==8)
        return (
0);
    else
        return (
1);
}

void F_I2C_Send_Data(unsigned char UC_Data)
{
    
unsigned char a;
    
SSPBUF UC_Data;
    while(
SSPSTATbits.BF==1);
    
a=F_I2C_WAIT();
}

void F_I2C_STOP(void)
{    
    
unsigned char a;
    
SSPCON2bits.PEN 1;
    
a=F_I2C_WAIT();
    for(
dy=0;dy<3;dy++);    //緩衝時間
}


//==================接收端  只做接收=============================
#include <p18f4431.h>
#include <i2c.h>
#include <delays.h>

unsigned char UC_I2C_CMD=0x00,TEMP=0x00;
void F_Check_I2C_CMD(void);
void i2c_Initial(void);

void High_INT_SER(void);
#pragma code High_Interrupt_Vector=0x08
void High_INT_VEC (void)
{
    
_asm
    
goto    High_INT_SER
    _endasm
}
#pragma code

#pragma interrupt High_INT_SER
void High_INT_SER (void)
{
    if ( 
PIR1bits.SSPIF == )
    {
        
TEMP=SSPBUF;
        
PIR1bits.SSPIF 0;
        
F_Check_I2C_CMD();
    }
}

void main(void)
{
    
i2c_Initial();
    while(
1);
}

void i2c_Initial(void)
{
    
LATD 0;
    
TRISD=0;
    
TRISCbits.TRISC4=1;
    
TRISCbits.TRISC5=1;
    
SSPSTATbits.SMP 0;
    
SSPSTATbits.CKE 0;
    
SSPCON 0x3e;
    
SSPADD 0x60 0xFE;
    
//======= i2c interrupt =======
    
PIE1bits.SSPIE=1;
    
IPR1bits.SSPIP=1;
    
//======= interrupt set =======
    
RCONbits.IPEN=1;
    
INTCONbits.GIEH=1;
    
INTCONbits.GIEL=1;

    
SSPSTATbits.BF=0;
    
SSPCONbits.SSPOV=0;
}

void F_Check_I2C_CMD(void)
{
    
SSPSTATbits.BF=0;
    
SSPCONbits.SSPOV=0;
    switch(
TEMP)
    {
        case 
0x60 0xFE:    
            break;

        default:
            
LATD=TEMP;
            break;
    }
}



發表於: 2006/5/4 20:55
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: I2C的問題(1個傳送,3個接收)
#6
資深會員
資深會員


查看用戶資訊
把傳送跟接收部分丟上來吧
應該是某些位元沒判斷到的關係
仔細對照規格書中的時序圖
(很重要,我後來是看時序圖才發現問題點)
看看自己程式中有哪些位元沒弄好導致錯誤吧

發表於: 2006/5/4 17:54
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: I2C的問題(1個傳送,3個接收)
#5
新會員
新會員


查看用戶資訊
請問一下
我用led來顯示接收到的資料值
傳送端一直傳資料
接收端就不斷把資料值顯示在led上
傳送端每隔2.5ms傳送一次資料
大約過半分鐘後
接收端就停住而無法繼續接收了

請問有可能是某些暫存器溢位造成的嗎?
不過,會溢位的暫存器我程式方面已經做過處理
但是還是發生無法繼續接收的情況
這是哪種原因造成的呢??

發表於: 2006/5/4 13:58
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: I2C的問題(1個傳送,3個接收)
#4
新會員
新會員


查看用戶資訊
很抱歉 我沒遇過耶= =
應該丟什麼到SSPBUF,就傳什麼出來才對...

我只碰過傳資料時傳的位址被當成資料,傳的資料被當成位址,所以接收端一直收不到...
後來把接收端的SSPADD改成傳送端傳過來的資料時,SSPBUF就可以收到位址了(事實上是傳送端傳來的資料),但是第二筆資料還是收不到...
用示波器看波形後發現SCL有19個方波(中間SCL held low的地方,SDA跟SCL產生一個方波,我只傳送2個BYTES,所以理論上是18個才對),上述傳送端傳的位址跟資料才被當成位址來傳了,所以才會發生傳的資料被當成位址的情況= =
最後 在開始跟結束的位元後都用for迴圈DELAY一段時間,就正常工作了

發表於: 2006/5/2 17:22
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: I2C的問題(1個傳送,3個接收)
#3
初級會員
初級會員


查看用戶資訊
請問一下喔!!你所傳出的資料會有一些是你不想要的ㄇ!!
譬如說你傳的是AA但是由時候會傳78...你有類似這樣的問題ㄇ
...........如果有你怎麼解決阿??

發表於: 2006/5/1 16:51
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: I2C的問題(1個傳送,3個接收)
#2
新會員
新會員


查看用戶資訊
我找到錯誤的來源了
因為接收端都沒加裝reset裝置
reset後就可以正常接收了= =

發表於: 2006/5/1 15:34
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


I2C的問題(1個傳送,3個接收)
#1
新會員
新會員


查看用戶資訊
各位大大好~
小弟我有個問題
我在使用一對一時, 接收端都可以確實的接收到資料
在用一對三時, 傳送端是輪流傳送資料至三個接收端
假設分別為1,2,3號接收端
剛開始可能是只有1號可以收到資料
後來跳到2號, 1號又收不到了,
再後來又跳到3號, 其他的又收不到了
接收情況就像上述跳來跳去, 而不是輪流接收
看傳送的波形時, 的確是輪流傳送三筆資料給三個接收端
請問這情形要如何解決呢

發表於: 2006/5/1 12:00
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------