?? i2c.c
字號:
#include <msp430xw42x.h>
#include "I2C.h"
//定義管腳
#define SCL BIT6
#define SDA BIT5
void I2C_Initial( void )
{
//將SCL管腳設置為輸出管腳
P1DIR |= SCL;
I2C_Set_sck_low();
I2C_STOP();
Delay_ms(10);
return;
}
void I2C_Set_sda_high( void )
{
//將SDA設置為輸出模式
P1DIR |= SDA;
//SDA管腳輸出為高電平
P1OUT |= SDA;
_NOP();
_NOP();
return;
}
void I2C_Set_sda_low ( void )
{
//將SDA設置為輸出模式
P1DIR |= SDA;
//SDA管腳輸出為低電平
P1OUT &= ~(SDA);
_NOP();
_NOP();
return;
}
void I2C_Set_sck_high( void )
{
//將SCL設置為輸出模式
P1DIR |= SCL;
//SCL管腳輸出為高電平
P1OUT |= SCL;
_NOP();
_NOP();
return;
}
void I2C_Set_sck_low ( void )
{
//將SCL設置為輸出模式
P1DIR |= SCL;
//SCL管腳輸出為低電平
P1OUT &= ~(SCL);
_NOP();
_NOP();
return;
}
int I2C_GetACK(void)
{
int nTemp = 0;
int j;
_NOP();
_NOP();
I2C_Set_sck_low();
for(j = 30;j > 0;j--);
//將SDA設置為輸入方向
P1DIR &= ~(SDA);
I2C_Set_sck_high();
for(j = 30;j > 0;j--);
//獲得數據
nTemp = (int)(P1IN & SDA);
I2C_Set_sck_low();
return (nTemp & SDA);
}
void I2C_SetACK(void)
{
I2C_Set_sck_low();
I2C_Set_sda_low();
I2C_Set_sck_high();
I2C_Set_sck_low();
return;
}
void I2C_SetNAk(void)
{
I2C_Set_sck_low();
I2C_Set_sda_high();
I2C_Set_sck_high();
I2C_Set_sck_low();
return;
}
void I2C_START(void)
{
int i;
I2C_Set_sda_high();
for(i = 5;i > 0;i--);
I2C_Set_sck_high();
for(i = 5;i > 0;i--);
I2C_Set_sda_low();
for(i = 5;i > 0;i--);
I2C_Set_sck_low();
return;
}
void I2C_STOP(void)
{
int i;
I2C_Set_sda_low();
for(i = 5;i > 0;i--);
I2C_Set_sck_low();
for(i = 5;i > 0;i--);
I2C_Set_sck_high();
for(i = 5;i > 0;i--);
I2C_Set_sda_high();
for(i = 5;i > 0;i--);
I2C_Set_sck_low();
//延遲一點時間
Delay_ms(10);
return;
}
void I2C_TxHToL(int nValue)
{
int i;
int j;
for(i = 0;i < 8;i++)
{
if(nValue & 0x80)
I2C_Set_sda_high();
else
I2C_Set_sda_low();
for(j = 30;j > 0;j--);
I2C_Set_sck_high();
nValue <<= 1;
for(j = 30;j > 0;j--);
I2C_Set_sck_low();
}
return;
}
void I2C_TxLToH(int nValue)
{
int i;
int j;
for(i = 0;i < 8;i++)
{
if(nValue & 0x01)
I2C_Set_sda_high();
else
I2C_Set_sda_low();
for(j = 30;j > 0;j--);
I2C_Set_sck_high();
nValue >>= 1;
for(j = 30;j > 0;j--);
I2C_Set_sck_low();
}
return;
}
/////////////////////////////////////////////
// 接收是從 LSB 到 MSB 的順序
int I2C_RxByte(void)
{
int nTemp = 0;
int i;
int j;
I2C_Set_sda_high();
//將SDA管腳設置為輸入方向
P1DIR &= ~(SDA);
_NOP();
_NOP();
_NOP();
_NOP();
for(i = 0;i < 8;i++)
{
I2C_Set_sck_high();
if(P1IN & SDA)
{
nTemp |= (0x01 << i);
}
for(j = 30;j > 0;j--);
I2C_Set_sck_low();
}
return nTemp;
}
/////////////////////////////////////////////
// 接收是從 MSB 到 LSB 的順序
int I2C_RxHToL(void)
{
int nTemp = 0;
int i;
int j;
I2C_Set_sda_high();
//將SDA管腳設置為輸入方向
P1DIR &= ~(SDA);
_NOP();
_NOP();
_NOP();
_NOP();
for(i = 0;i < 8;i++)
{
I2C_Set_sck_high();
if(P1IN & SDA)
{
nTemp |= (0x01 << (7 - i));
}
for(j = 30;j > 0;j--);
I2C_Set_sck_low();
}
return nTemp;
}
void Delay_ms(unsigned long nValue)//毫秒為單位,8MHz為主時鐘
{
unsigned long nCount;
int i;
unsigned long j;
nCount = 2667;
for(i = nValue;i > 0;i--)
{
for(j = nCount;j > 0;j--);
}
return;
}
void Delay_us(unsigned long nValue)//微秒為單位,8MHz為主時鐘
{
int nCount;
int i;
int j;
nCount = 3;
for(i = nValue;i > 0;i--)
{
for(j = nCount;j > 0;j--);
}
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -