MSP430F419 用 I/O 翻轉電平寫時序的延遲問題?
我是用MSP430F419發送資料給HT1621 , 讓段碼LCD顯示
#下圖示HT1621的其中一個模式
HT1621命令模式
WR是由低電平變為高電平時取DATA的資料
__ ______
CS | |
|__________________________________________________________________________|
______ __ __ __ __ __ __ __ __ __ __ __ __
| | | | | | | | | | | | | | | | | | | | | | | | |
WR |__| |__| |__| |__| |__| |__| |__| |__| |__| |__| |__| |__| |_______
____ __ _________________________________________________________________
| | | | |
DATA |__| |____________|__________________________________________________|
1 0 0 |-- C8 C7 C6 C5 C4 C3 C2 C1 C0 --|
要發送的命令碼
_______ __ __ ____
| | | | | |
WR |__| |__| |__|
|----|----|
t1 t2
T = t1 + t2
F = 1/T = 1/t1+t2 = 1/5us+5us = 1/10us= 100KHz , 我要讓WR位的頻率在100kHz , 這樣寫入頻率可以在100KHz , 所以我t1與t2用延遲5us
我運用 _NOP(); 做 t1 = t2 的延遲5us , 我MCLK=2MHz , 用示波器去查看當P1.0由高電平變成低電平的時間是否為5us , 如下程式碼
void delay_5us(void)
{
P1OUT=0x01;
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
P1OUT=0x00;
}
上列程式實際測試為5us
#下面是我寫的HT1621命令模式程式碼
void HT1621Cmd(uchar CmdValue)
{
uchar i;
uchar value = COMMAND_ID; //COMMAND_ID=0x80;
CS_OFF; //CS=0
delay_5us();
for( i = 0; i < 12; i++ )
{
if(i==3)
value = CmdValue;
WR_OFF;
delay_5us();
if((value&0x80)==0)
{
DATA_OFF;
delay_5us();
}
else
{
DATA_ON;
delay_5us();
}
WR_ON;
delay_5us();
value<<=1;
}
CS_ON; //CS=1
delay_5us();
}
我有接示波器去看 WR 與 DATA 整個時序的對應沒有問題 , 但是t1與t2的時間不是5us , 而是 t1 = 14us , t2 = 20us , 請問為什麼不是5us呢?
因為我之後有要寫I2C介面 , 如果用 I/O 翻轉電平方式模擬 I2C 時序 , 上面延遲時間方式(如delay_5us)依需求設定好延遲時間 , 但實際帶入時序運用時,實際延遲時間卻不同 , 這樣就不能達到自己需求的 I2C 寫入頻率,也會遇到上面延遲問題,希望能解決此問題.
麻煩大家看一下,是哪裡有問題呢? 謝謝