?? 5245.c
字號(hào):
#include<msp430x14x.h>
#define SDA_1 (P2OUT|=BIT5);
#define SDA_0 (P2OUT&=~BIT5);
#define SDA_OUT (P2DIR |=BIT5)
#define SDA_IN (P2DIR &=~BIT5)
#define SCL_1 (P2OUT|=BIT3);
#define SCL_0 (P2OUT&=~BIT3);
#define SCL_OUT (P2DIR |=BIT3);
#define SCL_IN (P2DIR &=~BIT3);
void init_cpu(void);
void I2C_init(void);
void I2C_START(void);
void I2C_STOP(void);
void ACK(void);
void NONACK(void);
void TESTACK(void);
void I2C_sendbyte(unsigned char byte);
unsigned char I2C_recvbyte(void);
void I2C_write(unsigned char addr,unsigned char instr,unsigned char data);
unsigned char I2C_read(unsigned char addr);
unsigned char rdata;
void main()
{
_DINT();//禁止中斷
WDTCTL = WDTPW +WDTHOLD;//關(guān)閉看門(mén)狗電路
init_cpu(); //init cpu
I2C_init();
_EINT(); //開(kāi)啟中斷
for(int tmp=0;tmp<1000;tmp++);
unsigned char waddr=0x58,raddr=0x59,instr=0x00,data=0xF0;
I2C_write(waddr,instr,data);
rdata=I2C_read(raddr);
}
void init_cpu(void)//初始化MSP430
{
int i;
BCSCTL1 = 0X00;//將寄存器的內(nèi)容清零//XT2震蕩器開(kāi)啟//LFTX1工作在低頻模式//ACLK的分頻因子為1
do
{
IFG1 &= ~OFIFG; // 清除OSCFault標(biāo)志
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG);// 如果OSCFault =1
BCSCTL2 = 0X00; //將寄存器的內(nèi)容清零
BCSCTL2 += SELM1; //MCLK的時(shí)鐘源為T(mén)X2CLK,分頻因子為1
BCSCTL2 += SELS; //SMCLK的時(shí)鐘源為T(mén)X2CLK,分頻因子為1
P5SEL |=BIT6;//把P5.6設(shè)為外部模塊功能
}
void I2C_init(void)
{
P2SEL&=~BIT3;
P2SEL&=~BIT5;
SCL_OUT;
SCL_1;
SDA_IN;
}
void I2C_START(void)
{
SDA_OUT;
SDA_1;
SCL_1;
_NOP();
SDA_0;
_NOP();
SCL_0;
_NOP();
}
void I2C_STOP(void) //停止
{ SDA_OUT;
SDA_0;
SCL_1;
_NOP();
SDA_1;
_NOP();
}
void ACK(void)//主機(jī)應(yīng)答信號(hào)
{SDA_OUT;
SDA_0;
SCL_1;
_NOP();
SCL_0;
_NOP();
SDA_1;
}
void NONACK(void)//主機(jī)反向應(yīng)答信號(hào)
{ SDA_OUT;
SDA_1;
SCL_1;
_NOP();
SCL_0;
_NOP();
}
void TESTACK(void)//獲取從機(jī)應(yīng)答信號(hào)
{
SDA_1;
SDA_IN;
SCL_1;
_NOP();
while(P2IN&BIT5);
SCL_0;
}
void I2C_sendbyte(unsigned char byte)
{
unsigned char temp=0x80;
unsigned char i;
SDA_OUT;
for(i=8;i>0;i--)
{
if((byte&temp)>0)
{
SDA_1;
}
else
{
SDA_0;
}
temp/=2;
_NOP();
SCL_1;
_NOP();
SCL_0;
_NOP();
}
}
unsigned char I2C_recvbyte(void)
{
unsigned char temp=0x80,data=0x00;
unsigned char i;
SDA_IN;
for(i=8;i>0;i--)
{
SCL_1;
_NOP();
SDA_IN;
if(P2IN&BIT5)
data|=temp;
temp/=2;
SCL_0;
_NOP();
}
return data;
}
void I2C_write(unsigned char addr,unsigned char instr,unsigned char data)
{
I2C_START();
I2C_sendbyte(addr);
TESTACK();
I2C_sendbyte(instr);
TESTACK();
I2C_sendbyte(data);
TESTACK();
I2C_STOP();
}
unsigned char I2C_read(unsigned char addr)
{
unsigned char temp=0x00;
I2C_START();
I2C_sendbyte(addr);
TESTACK();
temp=I2C_recvbyte();
NONACK();
I2C_STOP();
return temp;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -