?? i2c_16bit.c
字號:
#include "I2C_16BIT.H"
void init(void)
{
Init_WDT();
_DINT();
Init_Uart();
Init_Timer();
KillDog; // clear WDT
Init_AD();
_EINT();
FOCUS_IDLE; //控制調焦電機
}
void Init_WDT(void)
{
StartDog; // WDT 1000ms, ACLK
}
void Init_Timer(void)
{
CCR0 = 10485;
CCTL0 &= (~CCIE);
}
void Init_Uart(void)
{
P3SEL |= (BIT4 + BIT5); //P3.4,5 UART option select
BCSCTL1 |= DIVA_3; // ACLK= LFXT1CLK/8
ME2 |= (UTXE0 + URXE0); //enable txd and rxd
UCTL0 |= CHAR; //8-bit characters
UTCTL0 |= SSEL1; //UCLK = SMCLK
UBR00 = 0x36; // 19200 from 1Mhz
UBR10 = 0x00; //
UMCTL0 = 0XB5;//0x6B; // Modulation
UCTL0 &= (~SWRST); //Initialize USART state machine
IE2 |= URXIE0; //enable rxd interrupt
CCTL2 = CM_1 + CCIS_1 + CAP + CCIE; // CAP, ACLK, interrupt
TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, cont-mode, clear
}
void Init_AD(void)
{
ADC10CTL1 = INCH_1+ADC10DIV_3; // Temp Sensor ADC10CLK/4
ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON ; //REF1_5V
ADC10AE |= 0x02; // P2.1 ADC10 option select
}
float GetSysVoltage(void)
{
int long temp=0,i=0;
float tempt=0.0;
for(i=0;i<32;i++)
{
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
while (ADC10CTL1 & ADC10BUSY);
temp += ADC10MEM;
}
temp/=32;
tempt=(temp*18)/1024.0;
return(tempt);
}
void Delay(unsigned long cont)
{
unsigned long i;
for (i = 0; i < cont; i++)
{
;
}
}
//===================================================================================================//
//延時子程序
void I2C_Delay()
{
unsigned char i;
for (i = 0; i < I2C_TIME; i++){;}
}
//===================================================================================================//
//I2C總線停止信號
void I2C_Stop(void)
{
//負周期
SCLK_LOW;
I2C_Delay();
SDOUT_LOW;
I2C_Delay();
//正周期
SCLK_HIGH;
I2C_Delay();
//在正周期內產生一個上升沿
SDOUT_HIGH;
I2C_Delay();
SDOUT_LOW;
I2C_Delay();
SDOUT_HIGH;
I2C_Delay();
}
//===================================================================================================//
//I2C總線發送一個字
unsigned int I2C_transmit_word(unsigned int data)
{
unsigned int receive_data = 0;
unsigned int transmit_data = data;
unsigned char j;
for(j = 0; j < 5; j++)
{
//發送十六位數據
for(int i = 0; i < 16; i ++)
{
receive_data = receive_data >> 1;
receive_data = receive_data + I2C_transmit_bit(transmit_data);
transmit_data = transmit_data >> 1;
}
//判斷是否傳輸正確
if(receive_data == data)
{
I2C_transmit_bit(BIT0);
j = 5;//傳輸正確,跳出循環
}
else
{
I2C_transmit_bit(0x00);
}
I2C_Stop();
}
return receive_data;
}
//===================================================================================================//
//I2C總線發送一個BIT
unsigned int I2C_transmit_bit(unsigned int data)
{
unsigned int receive_data;
SCLK_LOW;
I2C_Delay();
if((data & BIT0) == BIT0)
{
SDOUT_HIGH;
}
else
{
SDOUT_LOW;
}
I2C_Delay();
SCLK_HIGH;
I2C_Delay();
SCLK_LOW;
I2C_Delay();
if(SDIN == BIT0)
{
receive_data = BITF;
}
else
{
receive_data = 0;
}
I2C_Delay();
return receive_data;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -