⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 msp430 非常经典的教材 希望对 msp430 的学者有帮助
💻 C
字号:
#include <msp430x42x.h>

#include "I2C.h"

void I2C_Initial( void )
{
    P1DIR = 0x00;
    P1OUT = 0x00;
    //将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_TxByte(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;
}

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 << (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;
}
//温度读取
int  I2C_ReadTemp(void)
{
    int temp = 0;
    char hi;
    char lo;
    //起始信号
    I2C_START();
    
    //发送写命令
    I2C_TxByte(0x90);
    //读取ACK
    temp = I2C_GetACK();
    //写入指针寄存器
    //指向温度寄存器
    I2C_TxByte(0x00);
    //读取ACK
    temp = I2C_GetACK();
    
    //发送读命令
    I2C_TxByte(0x91);
    //读取ACK
    temp = I2C_GetACK();
    //读高字节
    hi = I2C_RxByte();
    //发送ACK
    I2C_SetACK();
    //读低字节
    lo = I2C_RxByte();
    //发送NAK
    I2C_SetNAk();
    
    //将高低字节组合成一个整数
    temp = hi * 256 + lo;
    //低16位数据无效
    temp >>= 6;
    
    //停止信号
    I2C_STOP();
    
    return temp;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -