• 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: 關於使用PIC18F4431於APP001實驗板 --> I2C功能
#9
新會員
新會員


查看用戶資訊
以上問題都解決了

請問一下
我觀測波形後發現
有些資料會遺失

請問有那些方法可以增加傳送時的穩定性呢?

發表於: 2006/4/24 19:49
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 關於使用PIC18F4431於APP001實驗板 --> I2C功能
#8
新會員
新會員


查看用戶資訊
恩~謝謝版主回答
我對調後 Master可以傳送位址了

請問一下PIC18F452 的 I2C 的 Master 傳送資料的問題
在傳送數據後的ACK是由slave接受的嘛?
為何有個箭頭說"ACKSTAT in SSPCON2 = 1"
這樣的話不就代表沒有從slave接收到確認訊號
( 在PIC18FXX2 datasheet的156頁 )

了解的大大們就回答一下吧~
~~甘溫唷~~~


再問一個問題 :
MASTER端傳送的位址為0x12 資料為0x33
SLAVE端的SSPADD設為0x12, SSPBUF接收不到資料
把SLAVE端的SSPADD改為0x33, SSPBUF卻接收到0x33
看SDA-SCL波形發現,在傳送的第一個BYTE時, SCL的第九個脈衝對應到的SDA值都是HIGH, 照理說應該是LOW才對
會不會是這裡造成上述問題?
怎麼改程式都是如此....我要如何解決呢><"

註 : MASTER的晶片是PIC18F452,只做傳送
SLAVE的晶片是PIC18F4431,只做接收

//===================MASTER 端程式=======
#include <p18f452.h>
#include <delays.h>
#include <i2c.h>

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_Data=0x33, //0101 0101
I2C_Devicel=0x13; //0001 0010
F_Initial();
while(1)
{
F_I2C_START();
if (F_I2C_Send_Address(I2C_Devicel & 0XFE))
{
F_I2C_Send_Data(UC_I2C_Data);
}
F_I2C_STOP();
}
}

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)
{
SSPCON2bits.SEN = 1;
}

unsigned char F_I2C_WAIT(void)
{
if ( PIR1bits.SSPIF )
{
PIR1bits.SSPIF = 0;
return (1);
}
else
return (0);
}

unsigned char F_I2C_Send_Address(unsigned char UC_Address)
{
SSPBUF = UC_Address;
while(!SSPCON2bits.ACKSTAT);
if(!F_I2C_WAIT())
return (1);
else
return (0);
}

void F_I2C_Send_Data(unsigned char UC_Data)
{
SSPBUF = UC_Data;
while(!F_I2C_WAIT());
}

void F_I2C_STOP(void)
{
SSPCON2bits.PEN = 1;
while(!F_I2C_WAIT());
}


//===================SLAVE端程式=======
#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 == 1 )
{
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 = 0x13 & 0xFE;
SSPBUF=0x00;
//======= i2c interrupt =======
PIE1bits.SSPIE=1;
IPR1bits.SSPIP=1;
//======= interrupt set =======
RCONbits.IPEN=1;
INTCONbits.GIEH=1;
INTCONbits.GIEL=1;

SSPSTATbits.BF=0;
}

void F_Check_I2C_CMD(void)
{
TEMP=SSPBUF;
LATD=TEMP;
}


發表於: 2006/4/19 21:35
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 關於使用PIC18F4431於APP001實驗板 --> I2C功能
#7
版主
版主


查看用戶資訊
送出control Byte時,還要等第九個位元ACK後再檢查SSPIF位元以判斷資料是否正確地被Slave收到,

你的程式是先判斷再送ACK的clock,請修改一下:

int F_I2C_Send_Address(int UC_Address)
{
SSPBUF = UC_Address;
while(F_I2C_WAIT()==0);  //與下一行對調
if ( SSPCON2bits.ACKSTAT ) //
return 0;
else
return 1;
}

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


Re: 關於使用PIC18F4431於APP001實驗板 --> I2C功能
#6
新會員
新會員


查看用戶資訊
版主及各位大大好
以下是用PIC18F452寫的 I2C 程式
Master程式只做傳送
Slave程式只做接收

我測程式時碰到問題
在Master傳送位址時無法完全傳送完成
導致確認信號接收不到
跑程式時傳送端的SSPBUF為0x42 接收端的SSPBUF為0x7F
似乎只傳了一個low bit就結束位址傳送

請問一下問題出在哪裡?? 感激不盡
//============Master start==============
#include <p18f452.h>
#include <delays.h>
#include <i2c.h>

int a=0,b=0;//test

#define I2C_Write        0x00
#define I2C_Read        0x01
#define I2C_Device1        0x42    //0100 0010

void F_Initial(void);
void F_I2C_START(void);
int F_I2C_WAIT(void);
int F_I2C_Send_Address(int);
void F_I2C_Send_Data(int);
void F_I2C_STOP(void);

void main(void)
{
    
unsigned char UC_I2C_CMD=I2C_WriteUC_I2C_Data=0;
    
F_Initial();
    while(
1)
    {
        
F_I2C_START();
        if (
F_I2C_Send_Address(I2C_Device1)==1)
        {
            
F_I2C_Send_Data(UC_I2C_Data++);
            
b++;//for test
        
}
        
F_I2C_STOP();
        
Delay10KTCYx(10);
    }
}

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)
{
    
SSPCON2bits.SEN 1;
//    while(!F_I2C_WAIT());
}

int F_I2C_WAIT(void)
{
    if ( 
PIR1bits.SSPIF )
    {
        
PIR1bits.SSPIF 0;
        return 
1;
    }
    else
        return 
0;
}

int F_I2C_Send_Address(int UC_Address)
{
    
SSPBUF UC_Address;
    while(
F_I2C_WAIT()==0);
    if ( 
SSPCON2bits.ACKSTAT )
        return 
0;
    else
        return 
1;
}

void F_I2C_Send_Data(int UC_Data)
{
    
SSPBUF UC_Data;
    while(
F_I2C_WAIT()==0);
}

void F_I2C_STOP(void)
{
    
a++;//for test
    
SSPCON2bits.PEN 1;
    while(
F_I2C_WAIT()==0);
}
//============Master end==============


//============slave start==============
#include <p18f452.h>
#include <portb.h>
#include <i2c.h>
#include <delays.h>

int b=0;
unsigned char I2C_Data=0x01;

void F_Initial void );
void F_Enable_High_Interrupts void );
void F_Check_I2C_CMD(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 == )
    {
        
PIR1bits.SSPIF 0;
        
F_Check_I2C_CMD();
    }
}

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

void F_Initial ()
{
    
TRISD 0;
    
LATD 0;
    
TRISCbits.TRISC3 1;
    
TRISCbits.TRISC4 1;
    
SSPADD 0x42;
    
SSPSTATbits.SMP 1;
    
SSPSTATbits.CKE 0;
    
SSPCON1 0x3E;
    
PIE1bits.SSPIE 1;
    
IPR1bits.SSPIP 1;
    
F_Enable_High_Interrupts();
}

void F_Enable_High_Interrupts (void)
{
    
RCONbits.IPEN 1;
    
INTCONbits.GIEH 1;
}    

void F_Check_I2C_CMD(void)
{    
    
unsigned char UC_I2C_CMD,UC_Temp;
    
b++;
    
LATD SSPBUF;
}
//============slave end==============


發表於: 2006/4/14 18:46
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 關於使用PIC18F4431於APP001實驗板 --> I2C功能
#5
版主
版主


查看用戶資訊
I2C 的應用範例在W401 C18 workshop 裡第六章裡有用 C 寫的範例,那裡有詳細的說明。

發表於: 2006/4/8 11:34
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 關於使用PIC18F4431於APP001實驗板 --> I2C功能
#4
資深會員
資深會員


查看用戶資訊
有IIC功能的都有這些暫存器
而且位元的定義都一樣
只是名稱不一定相同
翻一下規格書吧

規格書裡都會把這個功能所需要用到的暫存器列出來
有用到的旗標是白色的
用不到的是灰色的
我剛剛有翻到
看看220頁的表18-3吧

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


Re: 關於使用PIC18F4431於APP001實驗板 --> I2C功能
#3
新會員
新會員


查看用戶資訊
恩~
感謝版主的回答!!

我又要問一個問題= =
我發現用18f452時,有個SSPCON2暫存器可以產生開始跟結束位元

但是 用18f4431時並沒有這個暫存器
這樣我需要如何產生開始與結束位元??
還是直接利用輸出的方式來產生這些位元呢?!



發表於: 2006/4/7 19:03
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 關於使用PIC18F4431於APP001實驗板 --> I2C功能
#2
版主
版主


查看用戶資訊
APP001 的 SCL,SDA 已經接了提升電阻在連接到 24LC02 及 TC74 兩顆IC,注意位址不可以重複,或著可以撥DIP SW 將 SCL, SDA 兩線斷開這樣就可以自行運用,提升電阻就另外再加。

發表於: 2006/4/7 18:28
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


關於使用PIC18F4431於APP001實驗板 --> I2C功能
#1
新會員
新會員


查看用戶資訊
請問一下
我要用4431的I2C的功能
看了一下4431的datasheet時,
發現需要在SCL及SDA腳位接上提升電阻

如果使用APP001實驗板
還需要外接提升電阻嗎?

有經驗的版主或大大幫忙解答一下吧~感謝~

發表於: 2006/4/7 15:24
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... ]

教育訓練中心

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