?? msp430f169的i2c程序(僅供參考).c
字號:
// I2CTCTL |= I2CSTP; //I2CRM =1模式中,在發(fā)送最后一個數(shù)據(jù)之前將停止位置位,*特別注意,必須
I2cBusSendByte(*ps);
while((I2CIFG & 0x02) == NACKIFG) // 等待數(shù)據(jù)的應(yīng)答
{
I2CTCTL |= I2CSTP; // 無應(yīng)答,結(jié)束總線
return(0);
}
return(1);
}
//------------------寫at24c512----
void I2cWrAt24c512(void)
{
unsigned int j=0;
unsigned char m,n;
unsigned int tempAddr;
for (j = 0;j <462;j++) // page write
{
tempAddr = 128*j;
while (I2CBUSY & I2CDCTL); // I2C ready?
I2cSendSubAddr(tempAddr,0x80);
I2cSendStr(FPGACfg+tempAddr,0x80);
P4OUT ^= 0x80;
for (m=0;m<125;m++) {for (n=0;n<110;n++);}
P4OUT ^= 0x80;
}
tempAddr = 128*j;
while (I2CBUSY & I2CDCTL); // I2C ready?
I2cSendSubAddr(tempAddr,0x4f);
I2cSendStr(FPGACfg+tempAddr,0x4f);
P4OUT ^= 0x80;
for (m=0;m<125;m++) {for (n=0;n<110;n++);}
P4OUT ^= 0x80;
}
/*-------------------------- MSP430 I2C
讀取數(shù)據(jù)-----------------------------*/
/*---------------------------------------------------------------------
--子程標號 :I2cSlaSubAddr
--子程功能 :主器件發(fā)送從機器件地址和子地址
--入口參數(shù) :unsigned int suba
--參數(shù)說明 :子地址
--子程調(diào)用 :I2cBusSendByte
--子程序狀況 :Y
--說明 :完成地址信息的定位,先確定順序讀寫的起始地址
---------------------------------------------------------------------
--*/
void I2cReceSubAddr(unsigned int suba) // test 09-25 讀之前先寫地址
{
unsigned char Hi_suba,Lo_suba;
P3OUT = 0x00; // clear P3 output register
P3SEL = 0x0A; // P3.1=SDA, P3.3=SCL,Select I2C pins, Setup I2C module
U0CTL |= I2C + SYNC; // select I2C mode;XA=0,7bit_addresing;
U0CTL &= ~I2CEN; // i2c功能使能無效
I2CTCTL = I2CSSEL_2; // I2CRM = 0,
I2CNDAT = 2; // I2CRM = 0,2byte地址 + 128byte數(shù)據(jù),固定字節(jié)
I2CIFG = 0;
I2CPSC = 1; // set scl
I2CSA = 0xa0; // Slave address of At24c512
U0CTL |= I2CEN; // enable I2C module, 7 bit addr, master mode 08-26
U0CTL |= MST;
Hi_suba = ( unsigned char )( suba >> 8 );
Lo_suba = ( unsigned char )( suba & 0x00ff );
while (I2CBUSY & I2CDCTL); // I2C ready? 在空閑狀態(tài):0,空閑;1:忙
I2CTCTL |= I2CTRX + I2CSTT + I2CSTP ; // I2CRM =0,啟動總線,發(fā)送從器件地址
while((I2CIFG & NACKIFG) == 0x02) // ack 為低電平,等待地址應(yīng)答位 ,判斷 無應(yīng)答NACKIFG = 1
{
I2CTCTL |= I2CSTP; // 結(jié)束總線
}
I2cBusSendByte( Hi_suba ); //發(fā)送器件子地址
while((I2CIFG & NACKIFG) == 0x02) // ack 為低電平,等待地址應(yīng)答位 ,判斷 無應(yīng)答NACKIFG = 1
{
I2CTCTL |= I2CSTP; // 結(jié)束總線
}
I2cBusSendByte( Lo_suba ); //發(fā)送器件子地址
while((I2CIFG & NACKIFG) == 0x02) // ack 為低電平,等待地址應(yīng)答位 ,判斷 無應(yīng)答NACKIFG = 1
{
I2CTCTL |= I2CSTP; // 結(jié)束總線
}
DelayTime10us(250);
DelayTime10us(250);
DelayTime10us(250);
DelayTime10us(250);
}
/*---------------------------------------------------------------------
--子程標號 :I2cSlaSubAddr
--子程功能 :主器件接收初始化
--入口參數(shù) :無
---------------------------------------------------------------------
--*/
void InitI2cRece(unsigned char num)
{
P3OUT = 0x00; // clear P3 output register
P3SEL = 0x0A; // P3.1=SDA, P3.3=SCL,Select I2C pins, Setup I2C module
U0CTL |= I2C + SYNC; // select I2C mode;XA=0,7bit_addresing;
U0CTL &= ~I2CEN; // i2c功能使能無效
// I2CTCTL = I2CRM + I2CSSEL_2; // I2CRM=1 x(x>256)字節(jié)模式
I2CTCTL = I2CSSEL_2; // I2CRM=0
I2CNDAT = num; // 1個字節(jié)
I2CPSC = 1; // set scl
I2CIFG = 0;
I2CSA = 0xa1; // Slave address of At24c512
I2CTCTL &= ~I2CTRX;
U0CTL |= I2CEN; // enable I2C module, 7 bit addr, master mode 08-26
}
/*---------------------------------------------------------------
--功能描述 : 讀一個字節(jié)
--子程序狀況 :
------------------------------------------------------------------
--*/
unsigned char I2cReceSlaByte(void)
{
unsigned char ch;
DelayTime10us(15);
U0CTL |= MST; //主模式
while (I2CBUSY & I2CDCTL); // I2C ready? 在空閑狀態(tài):0,空閑;1:忙
I2CTCTL |= I2CSTT + I2CSTP; // I2CRM =0; Receive, ST, SP (clears MST)
while((I2CIFG & RXRDYIFG) != RXRDYIFG); // 等待地址應(yīng)答位 ,判斷
ch = I2CDRB;
return(ch);
}
/*---------------------------------------------------------------
--功能描述 : 連續(xù)讀數(shù)據(jù)
--子程序狀況 :
------------------------------------------------------------------
--*/
void I2cReceSlaStr(unsigned char num)
{
unsigned char i;
DelayTime10us(15);
U0CTL |= MST; //主模式
while (I2CBUSY & I2CDCTL); // I2C ready? 在空閑狀態(tài):0,空閑;1:忙
I2CTCTL |= I2CSTT + I2CSTP; // I2CRM =0; Receive, ST, SP (clears MST)
for (i=0;i<num;i++)
{
while((I2CIFG & RXRDYIFG) != RXRDYIFG); // 等待地址應(yīng)答位 ,判斷
rxDataArray = I2CDRB;
}
}
void main()
{
WDTCTL=WDTPW+WDTHOLD;
I2cSendSubAddr(0x0000,0xa0);
I2cSendStr(temp,0x80);
DelayTime10us(250);
I2cReceSubAddr(0x0000);
InitI2cRece(1);
I2cReceSlaByte();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -