Помогите найти ошибку, пожалуйста.
Код
unsigned int I2C_Slave;
unsigned int I2C_TX_Cnt;
unsigned int I2C_RX_Cnt;
unsigned char I2C_TX_Buf[3];
unsigned char I2C_RX_Buf[3];
void I2C_Init(void)
{
P3SEL = 0x0A;
P3DIR &= ~0x0A;
U0CTL |= I2C + SYNC;
U0CTL &= ~I2CEN;
I2CTCTL = I2CTRX + I2CSSEL_2;
I2COA = 0x01A5;
I2CPSC = 0x00;
I2CSCLH = 0x03;
I2CSCLL = 0x03;
U0CTL |= TXDMAEN + RXDMAEN;
U0CTL |= I2CEN;
DMACTL0 = DMA1TSEL_4 + // I2C Transmit
DMA2TSEL_3; // I2C Recieve
DMA1CTL = DMASRCINCR_3 +// Source address increase
DMALEVEL + // Trigger on level
DMASRCBYTE + // Source - Byte
DMADSTBYTE; // Destination - Byte
DMA2CTL = DMADSTINCR_3 +
DMALEVEL +
DMASRCBYTE +
DMADSTBYTE;
DMA1SA = (int) I2C_TX_Buf;
DMA1DA = I2CDRB_;
DMA2SA = I2CDRB_;
DMA2DA = (int) I2C_RX_Buf;
}
void I2C_WriteInit(void)
{
U0CTL |= MST;
I2CTCTL |= I2CTRX; // I2CTRX=1 => Transmit Mode (R/nW bit = 0)
I2CIFG &= ~TXRDYIFG;
I2CIE |= TXRDYIE;
I2CSA = I2C_Slave;
I2CNDAT = I2C_TX_Cnt;
DMA1SZ = I2C_TX_Cnt;
DMA1CTL |= DMAEN;
}
void I2C_Write(void)
{
while (I2CDCTL&I2CBUSY);
I2C_WriteInit();
I2CTCTL |= I2CSTT + I2CSTP;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
I2C_Init();
_EINT();
I2C_Slave = 0x50;
I2C_TX_Cnt = 3;
I2C_TX_Buf[0] = 0x00;
I2C_TX_Buf[1] = 0x00;
I2C_TX_Buf[2] = 0x55;
I2C_Write();
while (I2CDCTL&I2CBUSY); // на этой строке остаётся навсегда :(
}
unsigned int I2C_TX_Cnt;
unsigned int I2C_RX_Cnt;
unsigned char I2C_TX_Buf[3];
unsigned char I2C_RX_Buf[3];
void I2C_Init(void)
{
P3SEL = 0x0A;
P3DIR &= ~0x0A;
U0CTL |= I2C + SYNC;
U0CTL &= ~I2CEN;
I2CTCTL = I2CTRX + I2CSSEL_2;
I2COA = 0x01A5;
I2CPSC = 0x00;
I2CSCLH = 0x03;
I2CSCLL = 0x03;
U0CTL |= TXDMAEN + RXDMAEN;
U0CTL |= I2CEN;
DMACTL0 = DMA1TSEL_4 + // I2C Transmit
DMA2TSEL_3; // I2C Recieve
DMA1CTL = DMASRCINCR_3 +// Source address increase
DMALEVEL + // Trigger on level
DMASRCBYTE + // Source - Byte
DMADSTBYTE; // Destination - Byte
DMA2CTL = DMADSTINCR_3 +
DMALEVEL +
DMASRCBYTE +
DMADSTBYTE;
DMA1SA = (int) I2C_TX_Buf;
DMA1DA = I2CDRB_;
DMA2SA = I2CDRB_;
DMA2DA = (int) I2C_RX_Buf;
}
void I2C_WriteInit(void)
{
U0CTL |= MST;
I2CTCTL |= I2CTRX; // I2CTRX=1 => Transmit Mode (R/nW bit = 0)
I2CIFG &= ~TXRDYIFG;
I2CIE |= TXRDYIE;
I2CSA = I2C_Slave;
I2CNDAT = I2C_TX_Cnt;
DMA1SZ = I2C_TX_Cnt;
DMA1CTL |= DMAEN;
}
void I2C_Write(void)
{
while (I2CDCTL&I2CBUSY);
I2C_WriteInit();
I2CTCTL |= I2CSTT + I2CSTP;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
I2C_Init();
_EINT();
I2C_Slave = 0x50;
I2C_TX_Cnt = 3;
I2C_TX_Buf[0] = 0x00;
I2C_TX_Buf[1] = 0x00;
I2C_TX_Buf[2] = 0x55;
I2C_Write();
while (I2CDCTL&I2CBUSY); // на этой строке остаётся навсегда :(
}
Ведомое устройство 100% рабочее (24LC64) (при заполнении буфера по прерыванию всё работает).
Контроллер MSP430F1611.
Заранее благодарен за помощь.