📄 msp430149_i2c.c
字号:
//******************************************************************************
// MSP-FET430P440 Demo - USART0 UART 2400 Ultra-low Power Echo ISR, 32kHz ACLK
//
// Description; Echo a received character, RX ISR used. In the Mainloop UART0
// is made ready to receive one character with interrupt active. The Mainloop
// waits in LPM3. The UART0 ISR forces the Mainloop to exit LPM3 after
// receiving one character which echo's back the received character.
// ACLK = UCLK0 = LFXT1 = 32768, MCLK = SMCLK = DCO = 32xACLK = 1.048576Mhz
// Baud rate divider with 32768hz XTAL @2400 = 32768Hz/2400 = 13.65 (000Dh)
// //*An external watch crystal is required on XIN XOUT for ACLK*//
//
// MSP430F449
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// | P2.4|----------->
// | | 2400 - 8N1
// | P2.5|<-----------
//
//
// M.Buccini
// Texas Instruments, Inc
// October 2003
// Built with IAR Embedded Workbench Version: 1.26B
// December 2003
// Updated for IAR Embedded Workbench Version: 2.21B
//******************************************************************************
#include <msp430x43x.h>
#define iic_io_init P4DIR |= 0XC0 //定义I/O口接线
#define iic_set_sda P4OUT |= BIT7
#define iic_clr_sda P4OUT &= ~BIT7
#define iic_set_scl P4OUT |= BIT6
#define iic_clr_scl P4OUT &= ~BIT6
#define iic_io_data P4IN & 0x80 //判断接受的数据是1还是0
unsigned char ack_flag;
//延时函数
void iic_delay(void)
{
int i;
for(i=0;i<5;i++);
}
//启动I2C
void start_iic(void)
{
iic_io_init;
iic_set_sda;
iic_delay();
iic_set_scl;
iic_delay();
iic_clr_sda;
iic_delay();
iic_clr_scl;
iic_delay();
}
// 停止IIC
void stop_iic(void)
{
iic_clr_sda;
iic_delay();
iic_set_scl;
iic_delay();
iic_set_sda;
iic_delay();
iic_clr_sda;
iic_delay();
iic_clr_scl;
}
//发送0
void send_zero(void)
{
iic_clr_scl;
iic_delay();
iic_clr_sda;
iic_delay();
iic_set_scl;
iic_delay();
}
//发送1
void send_one(void)
{
//iic_set_sda;
//iic_delay();
//iic_set_scl;
//iic_delay();
iic_clr_scl;
iic_delay();
iic_set_sda;
iic_delay();
iic_set_scl;
//iic_clr_sda;
iic_delay();
}
//发送1字节数据
void send_char(unsigned char sendtmp) //发送1字节程序,sendtemp是要发送的值
{
unsigned char cnt,tmp=0x80;
for(cnt=0; cnt<8; cnt++)
{
if((sendtmp & tmp)> 0)
{
send_one();
}else
{
send_zero();
}
tmp /= 2;
}
iic_clr_scl;
iic_set_sda;
iic_delay();
iic_delay();
}
//读1字节数据
unsigned char read_char(void)
{
unsigned char cnt,tmp=0x80,readtmp;
readtmp = 0x00;
for (cnt=0; cnt<8; cnt++)
{
iic_set_sda;
iic_delay();
iic_set_scl;
iic_delay();
if((iic_io_data) > 0x00)
{
readtmp |= tmp;
}
iic_clr_scl;
iic_delay();
tmp = tmp/2;
}
return readtmp; //返回读出来的值
}
//应答信号
void iic_ack(void)
{
ack_flag = 0x00;
//iic_set_sda;
iic_clr_scl;
iic_delay();
iic_set_scl;
P4DIR &= ~BIT7;
iic_delay();
if((iic_io_data) == 0x80 )
{
ack_flag = 0x01;
}
P4DIR |= BIT7;
iic_clr_scl;
iic_delay();
}
//iic_nack
void iic_nack(void)
{
iic_set_sda;
iic_delay();
iic_clr_scl;
iic_delay();
iic_clr_scl;
iic_delay();
iic_clr_sda;
iic_delay();
}
//写一个数据到EEPROM中
void write_eeprom(unsigned char ctrl_addres,unsigned char addres,unsigned char value)
//ctrl_addres是控制字段
//addres 是地址
//value 是值
{
unsigned char step_flag = 0x00;
while(step_flag < 0x03)
{
if(step_flag == 0x00)
{
start_iic();
send_char(ctrl_addres);
iic_ack();
if(ack_flag == 0) step_flag += 1;
}else if (step_flag == 1)
{
send_char(addres);
iic_ack();
if(ack_flag == 0)
{
step_flag += 1;
}
else
{
step_flag = 0;
}
}else
{
send_char(value);
iic_ack();
if(ack_flag == 0)
{
step_flag += 1;
}
else
{
step_flag = 0;
}
}
}
stop_iic();
}
//从EEPROM中读数据
unsigned char read_eeprom(unsigned char ctrl_addres,unsigned char addres)
//ctrl_addres 是控制字段
//addres是地址
{
unsigned char step_flag=0,value;
while (step_flag <0x03)
{
if(step_flag == 0x00)
{
start_iic();
send_char(ctrl_addres);
iic_ack();
if(ack_flag == 0) step_flag += 1;
}
else if (step_flag == 1)
{
send_char(addres);
iic_ack();
if(ack_flag == 0)
{
step_flag += 1;
}
else
{
step_flag = 0;
}
}
else
{
start_iic();
send_char(ctrl_addres+1);
iic_ack();
if(ack_flag == 0)
{
step_flag += 1;
value = read_char();
iic_nack();
}
else
{
step_flag = 0;
}
}
}
stop_iic();
return value;
}
void main( void )
{
unsigned char iic_value;
WDTCTL=WDTPW + WDTHOLD;
write_eeprom(0xA0,0x02,0x20);
iic_value = read_eeprom(0xa0,0x02);
iic_value = iic_value;
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -