📄 iicfor430.c
字号:
#include <MSP430x14x.h>
//#include "SysType.h"
#include "CLKReadWrite.h"
//作者:卢益贵 2008-1-8 上传 QQ:48092788
#define SCL 0x04 /* P2.1 */
#define SDA 0x02 /* P2.2 */
#define ADDR_I2CWRITE 0x64
#define ADDR_I2CREAD 0X65
#define ADDR_I2CSECOND 0X00
void InitCLK(void)
{
P2SEL &= ~(SCL | SDA);
P2DIR |= SCL;
P2DIR &= ~SDA;
P2OUT |= SCL;
CLKInit();
}
void Delay(unsigned char bLong)
{
while(bLong)
bLong--;
}
void I2CStart( void )
{
Delay( 0 );
P2OUT |= SDA;
Delay( 0 );
P2OUT |= SCL;
Delay( 0 );
P2OUT &=~ SDA;
Delay( 0 );
P2OUT &=~ SCL;
Delay( 0 );
}
void I2CStop( void )
{
Delay( 0 );
P2OUT &=~ SDA;
Delay( 0 );
P2OUT |= SCL;
Delay( 0 );
P2OUT |= SDA;
Delay( 0 );
}
void I2CAck( void )
{
Delay( 0 );
P2OUT &=~ SDA;
Delay( 0 );
P2OUT |= SCL;
Delay( 0 );
P2OUT &=~ SCL;
Delay( 0 );
}
void I2CNoAck( void )
{
Delay( 0 );
P2OUT |= SDA;
Delay( 0 );
P2OUT |= SCL;
Delay( 0 );
P2OUT &=~ SCL;
Delay( 0 );
}
void I2CTestAck( void )
{
Delay( 0 );
P2DIR &=~SDA;
Delay( 0 );
P2OUT |= SCL;
Delay( 0 );
P2DIR |=SDA;
Delay( 0 );
P2OUT &=~ SCL;
Delay( 0 );
}
void I2CWrite( unsigned char Data )
{
auto unsigned char i;
for( i = 8 ; i != 0 ; i--)
{
if ( Data & 0x80 )
P2OUT |= SDA;
else
P2OUT &=~ SDA;
P2OUT |= SCL;
Delay( 0 );
P2OUT &=~ SCL;
Delay( 0 );
Data = Data << 1;
}
}
unsigned char I2CRead( void )
{
auto unsigned char i , Result = 0;
P2DIR &=~SDA;
for( i = 8 ; i != 0 ; i-- )
{
P2OUT |= SCL;
Result = Result << 1;
Delay( 0 );
if ( ( P2IN & SDA ) == SDA )
Result = Result | 0X01;
P2OUT &=~ SCL;
Delay( 0 );
}
P2DIR |= SDA;
return( Result );
}
void CLKInit( void )
{
I2CStart();
I2CWrite( ADDR_I2CWRITE );
I2CTestAck();
I2CWrite( 0xe0 );
I2CTestAck();
// I2CWrite( 0xc3 );
I2CWrite( 0x00 );
I2CTestAck();
I2CWrite( 0x20 );
I2CTestAck();
I2CStop();
}
void SetDateTimeCLK( unsigned char *DT )
{
auto unsigned char i = 6;
I2CStart();
I2CWrite( ADDR_I2CWRITE );
I2CTestAck();
I2CWrite( ADDR_I2CSECOND );
I2CTestAck();
I2CWrite( *DT + *( DT+ 7 ) );
DT++;
I2CTestAck();
while( i > 0 )
{
I2CWrite( *DT++ );
I2CTestAck();
i--;
}
I2CStop();
}
void GetDateTimeCLK( unsigned char *DT )
{
auto unsigned char i = 0;
I2CStart();
I2CWrite( ADDR_I2CWRITE );
I2CTestAck();
I2CWrite( ADDR_I2CSECOND );
I2CTestAck();
I2CStart();
I2CWrite( ADDR_I2CREAD );
I2CTestAck();
while( i < 7 )
{
*DT = I2CRead();
*DT++ = ( *DT >> 4 ) * 10 + *DT % 16;
I2CAck();
i++;
}
*DT = I2CRead();
I2CNoAck();
I2CStop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -