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

📄 i2c.c

📁 MSP430单片机常用模块与综合系统实例精讲 的:“程序代码”、“实例插图”、“电路图”3个文件夹。以及MSP430F14X系列单片机的官方源码"CODE-MSP430F14X" 其中各个文件夹主要
💻 C
字号:
#include <msp430xw42x.h>
#include "I2C.h"

//定义管脚
#define SCL BIT6
#define SDA BIT5

void I2C_Initial( void )
{
    //将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_TxHToL(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;
}
void I2C_TxLToH(int nValue)
{
    int i;
    int j;
    
    for(i = 0;i < 8;i++)
    {
    	if(nValue & 0x01)
    	    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;
}
/////////////////////////////////////////////
// 接收是从 LSB 到 MSB 的顺序
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 << i);
    	}
    	for(j = 30;j > 0;j--);
    	I2C_Set_sck_low();
    }
    
    return nTemp;
}
/////////////////////////////////////////////
// 接收是从 MSB 到 LSB 的顺序
int  I2C_RxHToL(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;
}

⌨️ 快捷键说明

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