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

📄 i2c.c

📁 MSP4250单芯片电子称,采样数据无线发送给主机,编译环境IAR for MSP430
💻 C
字号:
/*
*********************************************************************************************************
*                                              MSP430
*                                        I2C functions
*
*
* File    : I2C.C
* Data	  : April 12, 2007
*********************************************************************************************************
*/

#include "hal.h"

/*
*********************************************************************************************************
*                                         SD16Start
*
* Description      :send start includeing repeat start
* Arguments        :
* Returned Values  : none
* Note(s)/Warnings :
*	   	    ____         _________        ____
*	SDA___/     \_______/         \______/
*	          _____         _____        ______
*	SCL_____/      \_______/     \______/
*	
*	        | START |               |  STOP  |
*********************************************************************************************************
*/
void I2C_Start(void)
{		

	I2C_SDA_DIRO;  //
    I2C_SDA_SET; I2C_Wait();
    I2C_SCL_SET; I2C_Wait();
	
    I2C_SDA_CLR; I2C_Wait();
    I2C_SCL_CLR; I2C_Wait();
}

/*
*********************************************************************************************************
*                                         I2C_Stop
*
* Description      :
* Arguments        : none
* Returned Values  : none
* Note(s)/Warnings :
*********************************************************************************************************
*/
void I2C_Stop(void)
{
	I2C_SDA_DIRO;
    I2C_SDA_CLR; I2C_Wait();
	
    I2C_SCL_SET; I2C_Wait();
    I2C_SDA_SET; I2C_Wait();
}

/*
*********************************************************************************************************
*                                         I2C_Send_Byte
*
* Description      :
* Arguments        :
* Returned Values  :
* Note(s)/Warnings :
*********************************************************************************************************
*/
char I2C_Send_Byte(char data)
{
	char i;

	I2C_SDA_DIRO;
	for (i = 8; i ; i--) {
		if(data & MSB) I2C_SDA_SET;							// MSB first
		else I2C_SDA_CLR;
		
		data <<= 1;
		I2C_Wait();
		
		I2C_SCL_CLK; I2C_Wait();
	}

	I2C_SDA_DIRI; I2C_Wait();
	
	I2C_SCL_SET;  I2C_Wait();
	i = I2C_SDA_IN;  		
	I2C_SCL_CLR;
	
	return i;
}

/*
*********************************************************************************************************
*                                         I2C_Receive_Byte
*
* Description      :
* Arguments        : none
* Returned Values  :
* Note(s)/Warnings :
*********************************************************************************************************
*/
char I2C_Receive_Byte(void)
{
    char i, data;
	
	I2C_SDA_DIRI;
    for (i = 0; i < 8; i++){
        I2C_SCL_SET; I2C_Wait();
        data <<= 1;
        if (I2C_SDA_IN) data |= 0x01;

        I2C_SCL_CLR; I2C_Wait();
    }
    return data;
}

/*
*********************************************************************************************************
*                                         Send_Ack
*
* Description      :
* Arguments        : ACK=0,  NON-ACK=1
* Returned Values  : none
* Note(s)/Warnings :
*********************************************************************************************************
*/
void Send_Ack(char ack)
{
	
    I2C_SDA_DIRO;
	if(ack) I2C_SDA_SET;
	else I2C_SDA_CLR;
	I2C_SCL_CLK;
}
/*
*********************************************************************************************************
*                                         I2C_Test
*
* Description      :
* Arguments        :
* Returned Values  :
* Note(s)/Warnings :
*********************************************************************************************************
*/
char I2C_Test(void)
{
	char dataO[2],dataN[2];
	char result;
	
	result = 0x00;
	/*read old data*/
	dataN[0] = I2C_Read_Byte(I2C_TEST_ADDR);
	dataO[1] = I2C_Read_Byte(I2C_TEST_ADDR+1);		
	
	/*test byte write/read*/
	dataO[0] += 2;											
	I2C_Write_Byte(I2C_TEST_ADDR, dataO[0]);
	dataN[0] = I2C_Read_Byte(I2C_TEST_ADDR);
	if(dataO[0] == dataN[0]){
		result = 0x01;										//byte write/read ok
	}
	
	/*test string write /read*/
	dataO[0] += 2;
	dataO[1] += 3;
	I2C_Write_String(I2C_TEST_ADDR, dataO,2);		
	I2C_Read_String(I2C_TEST_ADDR, dataN,2);
	if((dataO[0] == dataN[0]) && (dataO[1] == dataN[1])){
		result |= 0x02;										//string write/read  ok
	}
	return result;
}

/*
*********************************************************************************************************
*                                         I2C_Read_Byte
*
* Description      :
* Arguments        :
* Returned Values  :
* Note(s)/Warnings :
*********************************************************************************************************
*/
char I2C_Read_Byte(char addr)
{
	char data;

    I2C_Start();
    I2C_Send_Byte(I2C_DEVICE);
    I2C_Send_Byte(addr);
	
    I2C_Start();
    I2C_Send_Byte(I2C_DEVICE | I2C_READ_MSK);
    data = I2C_Receive_Byte();
    Send_Ack(I2C_NOACK);
	
    I2C_Stop();
    return data;
}

/*
*********************************************************************************************************
*                                         I2C_Read_String
*
* Description      :
* Arguments        :
* Returned Values  :
* Note(s)/Warnings :
*********************************************************************************************************
*/
void I2C_Read_String(char addr, char *pdata, char n)
{

    I2C_Start();
    I2C_Send_Byte(I2C_DEVICE);
    I2C_Send_Byte(addr);			//Write WORD ADDRESS
	
    I2C_Start();
    I2C_Send_Byte(I2C_DEVICE | I2C_READ_MSK);
	
	while(n>1){
		*pdata++ = I2C_Receive_Byte();
		Send_Ack(I2C_ACK);
		n--;
	}
	*pdata = I2C_Receive_Byte();
    Send_Ack(I2C_NOACK);
	
    I2C_Stop();
}

/*
*********************************************************************************************************
*                                         I2C_Write_Byte
*
* Description      :
* Arguments        :
* Returned Values  :
*			0, error
*			1, ok
* Note(s)/Warnings :
*********************************************************************************************************
*/
char I2C_Write_Byte(char addr,char data)
{
	
	I2C_Start();
	I2C_Send_Byte(I2C_DEVICE);
	I2C_Send_Byte(addr);
	I2C_Send_Byte(data);
	I2C_Stop();
    I2C_WAIT_WRITE;
	
#ifdef I2C_CHACK_EN		//check  data
	if(data != I2C_Read_Byte(addr)) return 0;
#endif
	return 1;
}

/*
*********************************************************************************************************
*                                    I2C_Write_String
*
* Description      :
* Arguments        :
* Returned Values  :
*			0, error
*			1, ok
* Note(s)/Warnings :
*********************************************************************************************************
*/
char I2C_Write_String(char addr, char *pdata, char n)
{
	char i = n;
	char *p = pdata;
	
	I2C_Start();
	I2C_Send_Byte(I2C_DEVICE);
	I2C_Send_Byte(addr);
	
	while(i--)
		I2C_Send_Byte(*pdata++);
		
	I2C_Stop();
    I2C_WAIT_WRITE;
	
#ifdef I2C_CHACK_EN		
	I2C_Start();
    I2C_Send_Byte(I2C_DEVICE);
    I2C_Send_Byte(addr);			
	
    I2C_Start();
    I2C_Send_Byte(I2C_DEVICE | I2C_READ_MSK);
	
	while(n > 1){
		i = I2C_Receive_Byte();
		Send_Ack(I2C_ACK);
		n--;
		if(i!= *p++){
			I2C_Stop();
			return 0;
		}
	}
	i = I2C_Receive_Byte();
    Send_Ack(I2C_NOACK);
	I2C_Stop();
	
	if(i!= *p) return 0;
#endif
	return 1;
}

/*
*********************************************************************************************************
*                                         I2C_TEST
*
* Description      : tesr I2C hardware
* Arguments        : none
* Returned Values  : none
* Note(s)/Warnings :
*********************************************************************************************************
*/
#ifdef DEBUG
#ifdef DEBUG_I2C
void I2C_TEST(void)
{
		char val;
		val = I2C_Test();	
		val = val;
}
#endif
#endif
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------

⌨️ 快捷键说明

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