📄 i2c.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 + -