會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





請教有關PIC18F25 i2c用法
初級會員
註冊日期:
2018/04/19 23:58
所屬群組:
註冊會員
文章: 36
等級: 4; EXP: 76
HP : 0 / 94
MP : 12 / 434
離線
請教有關PIC18F25 i2c用法

問題1:使用pic(master) readbyte form VL6180 的方式是否正確(附件)

uint8 data=0;
OSCCONbits.IRCF = 0b111;
ANSELA=7;
TRISB=6;
OpenI2C2(MASTER,SLEW_ON);
SSP2ADD=0x27;

IdleI2C2();
StartI2C2();
WriteI2C2(0x52);
AckI2C2();
WriteI2C2(0x00);
AckI2C2();
WriteI2C2(0x16);
AckI2C2();
StopI2C2();

StartI2C2();//要用ReStartI2C2()嗎? 功能有何差異)
WriteI2C2(0x53);
AckI2C2();
data = ReadI2C2();
NotAckI2C2()
StopI2C2();


問題2:用IdleI2C2();好處是什麼

StartI2C2();
IdleI2C2();
WriteI2C2(0x36);
IdleI2C2();

data = ReadI2C2(); // Read byte of data
IdleI2C2();
AckI2C2();
IdleI2C2();
WriteI2C2(0x02);
IdleI2C2();
data = ReadI2C2(); // Read byte of data
IdleI2C2();
AckI2C2();
StopI2C2(); // Stop condition I2C on bus

附加檔案:



jpg  vl6180.jpg (126.75 KB)
72908_5da53012ac60d.jpg 1024X746 px

10月15日 10:35:42
轉換PDF檔 列印


Re: 請教有關PIC18F25 i2c用法
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14850
等級: 73; EXP: 60
HP : 1089 / 1815
MP : 4950 / 82475
離線
問題1:使用pic(master) readbyte form VL6180 的方式是否正確(附件)

看起來這隨機讀取的步驟是沒有錯。 更詳細的城市說明可以參考 W401 教育訓練的第六章的範例與說明。


問題2:用IdleI2C2();好處是什麼

用來確定 I2C Bus 的狀態是否閒置了? 它會檢查 4 個位元的狀態。
一般是使用在 Multi-Master 2的型態。單一 Master 是可以省去的。

10月16日 11:43:38
轉換PDF檔 列印


Re: 請教有關PIC18F25 i2c用法
初級會員
註冊日期:
2018/04/19 23:58
所屬群組:
註冊會員
文章: 36
等級: 4; EXP: 76
HP : 0 / 94
MP : 12 / 434
離線
看過mc201教材 還是有一些不確定地方
下列為裝置地址
Device add 0x29(7bits)
Write 0x52
Read 0x53

問題
1-請問WriteI2C2(add)。add要填入上述那個值?
2-Mcc產生的函數 I2C1_MasterWrite ,位址是要填入上述那個值?

10月27日 15:20:20
轉換PDF檔 列印


Re: 請教有關PIC18F25 i2c用法
初級會員
註冊日期:
2018/04/19 23:58
所屬群組:
註冊會員
文章: 36
等級: 4; EXP: 76
HP : 0 / 94
MP : 12 / 434
離線
我使用教材上的function,EMULATED_EEPROM_Read()第一次成功讀取,可是在第二次讀取其他位置時,就當機。目前手邊無示波器可看波型。
請問有什麼方式可以改進?


void EMULATED_EEPROM_Read(
uint16_t slaveDeviceAddress,
uint16_t dataAddress,
uint8_t *pData,
uint16_t nCount)
{
I2C1_MESSAGE_STATUS status;
I2C1_TRANSACTION_REQUEST_BLOCK readTRB[2];
uint8_t writeBuffer[3];
uint16_t timeOut;

// this initial value is important
status = I2C1_MESSAGE_PENDING;

// build the write buffer first
// starting address of the EEPROM memory
writeBuffer[0] = (dataAddress >> 8); // high address
writeBuffer[1] = (uint8_t)(dataAddress); // low low address

// we need to create the TRBs for a random read sequence to the EEPROM
// Build TRB for sending address
I2C1_MasterWriteTRBBuild( &readTRB[0],
writeBuffer,
2,
slaveDeviceAddress);
// Build TRB for receiving data
I2C1_MasterReadTRBBuild( &readTRB[1],
pData,
nCount,
slaveDeviceAddress);

timeOut = 0;

while(status != I2C1_MESSAGE_FAIL)
{
// now send the transactions
I2C1_MasterTRBInsert(2, readTRB, &status);

// wait for the message to be sent or status has changed.
while(status == I2C1_MESSAGE_PENDING);

if (status == I2C1_MESSAGE_COMPLETE)
break;

// if status is I2C1_MESSAGE_ADDRESS_NO_ACK,
// or I2C1_DATA_NO_ACK,
// The device may be busy and needs more time for the last
// write so we can retry writing the data, this is why we
// use a while loop here

// check for max retry and skip this byte
if (timeOut == SLAVE_I2C_GENERIC_RETRY_MAX)
break;
else
timeOut++;

}

}

10月27日 21:52:02
轉換PDF檔 列印


Re: 請教有關PIC18F25 i2c用法
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14850
等級: 73; EXP: 60
HP : 1089 / 1815
MP : 4950 / 82475
離線
1. 我看不出來你所使用的 I2C 函數是打哪來的? 還有你要讀取的元件 (I2C Slave Device) 為何?

2. 沒有示波器很辛苦的? 而且使人別人所提供的函數,到底送出了什麼訊號也只能用猜的。

3. 做完 I2C 的動作後有沒有送出 STOP 的訊號,這我猜不出來。注意一下,I2C 的動作沒有完成全部的步驟,有時 PIC (Master) 會被卡住,這需要重新再 Reset I2C 介面的。

10月28日 10:29:53
轉換PDF檔 列印


Re: 請教有關PIC18F25 i2c用法
初級會員
註冊日期:
2018/04/19 23:58
所屬群組:
註冊會員
文章: 36
等級: 4; EXP: 76
HP : 0 / 94
MP : 12 / 434
離線
1. 我看不出來你所使用的 I2C 函數是打哪來的? 還有你要讀取的元件 (I2C Slave Device) 為何?

salve Device add 0x29(7bits)
Write 0x52(經由0x29 <<1)
Read 0x53(經由0x29 <<1)

分享結果-->直接用7 bitssalve Device add,

原始碼-->來自microchip 官方MCC產生的範例

void I2C1_MasterRead(
uint8_t *pdata,
uint8_t length,
uint16_t address,
I2C1_MESSAGE_STATUS *pstatus);

/**
@Summary
Inserts a list of i2c transaction requests into the i2c
transaction queue.

@Description
The i2c processes lists of transaction requests. Each transaction
list is handled as a string of i2c restarts. When the list of
transactions is complete, an i2c stop is produced, the flag is set
with the correct condition code and the next list is processed
from the queue.

This function inserts lists of requests prepared by the user
application into the queue along with a pointer to the completion
flag.

The transaction is inserted into the list only if there is space
in the list. If there is no space, the function exits with the
flag set to I2C1_MESSAGE_FAIL.

@Preconditions
None

@Param
count - The numer of transaction requests in the trb_list.

@Param
*ptrb_list - A pointer to an array of transaction requests (TRB).
See I2C1_TRANSACTION_REQUEST_BLOCK definition for details.

@Param
*pflag - A pointer to a completion flag.

@Returns
None

@Example
<code>


void EMULATED_EEPROM_Read(
uint16_t slaveDeviceAddress,
uint16_t dataAddress,
uint8_t *pData,
uint16_t nCount)
{
I2C1_MESSAGE_STATUS status;
I2C1_TRANSACTION_REQUEST_BLOCK readTRB[2];
uint8_t writeBuffer[3];
uint16_t timeOut;

// this initial value is important
status = I2C1_MESSAGE_PENDING;

// build the write buffer first
// starting address of the EEPROM memory
writeBuffer[0] = (dataAddress >> 8); // high address
writeBuffer[1] = (uint8_t)(dataAddress); // low low address

// we need to create the TRBs for a random read sequence to the EEPROM
// Build TRB for sending address
I2C1_MasterWriteTRBBuild( &readTRB[0],
writeBuffer,
2,
slaveDeviceAddress);
// Build TRB for receiving data
I2C1_MasterReadTRBBuild( &readTRB[1],
pData,
nCount,
slaveDeviceAddress);

timeOut = 0;

while(status != I2C1_MESSAGE_FAIL)
{
// now send the transactions
I2C1_MasterTRBInsert(2, readTRB, &status);

// wait for the message to be sent or status has changed.
while(status == I2C1_MESSAGE_PENDING);

if (status == I2C1_MESSAGE_COMPLETE)
break;

// if status is I2C1_MESSAGE_ADDRESS_NO_ACK,
// or I2C1_DATA_NO_ACK,
// The device may be busy and needs more time for the last
// write so we can retry writing the data, this is why we
// use a while loop here

// check for max retry and skip this byte
if (timeOut == SLAVE_I2C_GENERIC_RETRY_MAX)
break;
else
timeOut++;

}

}

</code>

*/

void I2C1_MasterTRBInsert(
uint8_t count,
I2C1_TRANSACTION_REQUEST_BLOCK *ptrb_list,
I2C1_MESSAGE_STATUS *pflag);

/**
@Summary
This function populates a trb supplied by the calling function
with the parameters supplied by the calling function.

@Description
All i2c requests are in the form of TRB's. This helper function
takes standard parameters and correctly formats the TRB. The R/W
bit is set to ensure that the resulting TRB describes an i2c read
operation.

This function does not send the transaction. To send the transaction,
the TRB insert function (I2C1_MasterTRBInsert()) must be called.

@Preconditions
None

@Param
*ptrb - A pointer to a caller supplied TRB.

@Param
*pdata - A pointer to the block of data to be received

@Param
length - The length of the data block to be received

@Param
address - The address of the i2c peripheral to be accessed

@Returns
None

@Example
<code>
Refer to I2C1_MasterTRBInsert() for an example
</code>

*/

void I2C1_MasterReadTRBBuild(
I2C1_TRANSACTION_REQUEST_BLOCK *ptrb,
uint8_t *pdata,
uint8_t length,
uint16_t address);

/**
@Summary
This function populates a trb supplied by the calling function
with the parameters supplied by the calling function.

@Description
All i2c requests are in the form of TRB's. This helper function
takes standard parameters and correctly formats the TRB. The R/W
bit is cleared to ensure that the resulting TRB describes an i2c
write operation.

This function does not send the transaction. To send the transaction,
the TRB insert function (I2C1_MasterTRBInsert()) must be called.

@Preconditions
None

@Param
*ptrb - A pointer to a caller supplied TRB.

@Param
*pdata - A pointer to the block of data to be sent

@Param
length - The length of the data block to be sent

@Param
address - The address of the i2c peripheral to be accessed

@Returns
None

@Example
<code>
Refer to I2C1_MasterTRBInsert() for an example
</code>

*/

void I2C1_MasterWriteTRBBuild(
I2C1_TRANSACTION_REQUEST_BLOCK *ptrb,
uint8_t *pdata,
uint8_t length,
uint16_t address);

/**
@Summary
This function returns the empty status of the Master
queue.

@Description
This function returns the empty status of the Master
queue. Use this function to check if the queue is empty.
This can verify if the Master is currently idle.

@Preconditions
None

@Param
None

@Returns
True if the queue is empty and false if the queue is not empty.

@Example
<code>
#define MCHP24AA512_ADDRESS 0x50 // slave device address

// check until queue is empty
while(I2C1_MasterQueueIsEmpty() == false);

// now send more data (assume readBuffer is initialized)
I2C1_MasterRead( readBuffer,
3,
MCHP24AA512_ADDRESS,
&status);

</code>

*/

10月28日 23:43:20
轉換PDF檔 列印


Re: 請教有關PIC18F25 i2c用法
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14850
等級: 73; EXP: 60
HP : 1089 / 1815
MP : 4950 / 82475
離線
既然是 MCC 所產生的程式碼可以參考一下 MCC201 V3.0x 的教材,在右邊的教育訓練光碟裡面有。

10月29日 02:57:38
轉換PDF檔 列印


Re: 請教有關PIC18F25 i2c用法
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14850
等級: 73; EXP: 60
HP : 1089 / 1815
MP : 4950 / 82475
離線
既然是 MCC 所產生的程式碼可以參考一下 MCC201 V3.0x 的教材,在右邊的教育訓練光碟裡面有。

10月29日 02:57:39
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project