📄 hdi2c.c
字号:
/*
ChangShu Microelectronics Technologies Co., Ltd.
Hardware I2C Communication Routines for MSP430 15,16 Series
Copyrights Reverved, 2005
Creation:2005.4.10
Last Update:2005.4.19
Programmer: Steven Z.
*/
#include "chip.h"
#include "string.h"
#include "hdi2c.h"
#include "sport1.h"
#include "pcf8574.h"
void (*I2CISR[])(void )={
I2CIdleISR, //0x00
0,
I2CArbLosISR, //0x02
0,
I2CNAckISR, //0x04
0,
I2COwAddISR, //0x06
0,
I2CRdyISR, //0x08
0,
I2CRxISR, //0x0a
0,
I2CTxISR, //0x0c
0,
I2CGenCalISR, //0x0e
0,
I2CBegDetISR}; //0x10
char *ptrI2Cbuf;
unsigned char I2CRxflg;
unsigned char I2CBuf;
void InitI2C()
{
UCTL0 |=SWRST; //Ready for configurating I2C register
UCTL0 |=SYNC| I2C ; //Configuration SUART to I2C mode
UCTL0 &=~I2CEN;
//================= Starting Of I2C FUNCTION CONFIGURATION========================//
I2CTCTL=I2CSSEL_2; //Byte transferring mode and amounts controlled by I2CNGAT; SMCLK used,
I2CPSC=2; //The inner signal I2CIN = 2M @ 8Mhz OSC
I2CSCLH=4; //~2.5us,high periode of SCK at 400K transmission rate @ 8M I2CIN
I2CSCLL=4; //~2.5us,low periode of SCK at 400K transmission rate @ 8M I2Cin
/*As a single master device, the following bitS should be disabled
1.Start detect interrupt disable,Only used when MSP430 is as a slave
2.General call interrupt disable, namely disabling the broadcast calling of I2C protocol;
3.Own address interrupt disable, Only used when MSP430 is as a slave
4.Arbitration lost interrupt disable, Only used when using mulit-master application
Current, these funciton are variable
1.Transmission Interrupt may be operated as polling when disable.
2.Receive Interrupt
3.I2C Ready Interrupt
4.NACK interrupt
*/
I2CIE=RXRDYIE;//+NACKIE; //TXRDYIE++ARDYIE;
UCTL0 |=I2CEN; //I2C module avariable
//================= End Of I2C FUNCTION CONFIGURATION========================//
P3SEL |=0x0A; //P3.3(SCK),P3.1(SDA)
P3DIR &=0xFD;
I2CRxflg=0; //I2C Rx S/W flag
}
#pragma vector=UART0TX_VECTOR
__interrupt void I2C_ISR(void)
{
I2CISR[I2CIV]();
}
void I2CIdleISR(){}
void I2CArbLosISR(){}
void I2CNAckISR()
{
I2CIFG &=~NACKIFG;
_DINT();
Tx1S("\nSlave unresponse\n");
_EINT();
}
void I2COwAddISR(){}
void I2CRdyISR()
{
_DINT();
Tx1S("\nSlave Ready\n");
_EINT();
}
void I2CRxISR()
{
I2CBuf=I2CDRB;
I2CRxflg=1;
}
void I2CTxISR()
{
}
void I2CGenCalISR(){}
void I2CBegDetISR(){}
/* Using RX interrupt */
unsigned char I2CRxByte(unsigned char addr)
{
UCTL0 |=MST ; //7-bit addressing; I2C master mode; Disabling DMA and Loopback enabled.
while(CHK_I2CBUS_STAT); //I2C module available
while(CHK_I2C_BUSY); //Waiting for previous completion of TX
I2CSA=addr; //Transmiting slave device of I2C
I2CNDAT=1; //Setting the length of data to be received
I2CTCTL|=I2CSTT | I2CSTP; //Initiate the transaction of I2C
while(!CHK_I2C_RXRDY); //Waiting Rx data
while(CHK_I2C_BUSY);
return I2CBuf;
}
void I2CTxByte(unsigned char addr,char cbuf)
{
UCTL0 |=MST ; //7-bit addressing; I2C master mode; Disabling DMA and Loopback enabled.
while(CHK_I2CBUS_STAT); //Optional,Checking I2C Bus status for mulit-master mode
while(CHK_I2C_BUSY); //Waiting for previous completion of TX
I2CTCTL |=I2CTRX; //Tx mode
I2CSA=addr; //Transmiting target slave device of I2C
I2CNDAT=1; //Setting the length of data to be sent
I2CTCTL |=I2CSTT | I2CSTP; //Initiation the transaction of I2C
while(CHK_I2C_BUSY) //Tx data with automatically repeat mode
{
if(CHK_I2C_TXRDY) I2CDRB=cbuf;
}
//Switching to Rx mode (I2C default)
I2CTCTL &=~I2CTRX; //Rx mode
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -