[Help] Cảm biến la bàn CMPS03

TTQ

Thành Viên PIF
Em đang dùng I2C để giao tiếp với cảm biến gia tốc CMPS03, đoạn code em viết như sau:

/*
* include thư viện
*/
#include <MSP430G2553.h>

/*
* Các Biến Toàn Cục
*/
unsigned char I2Cdataread;


#include "msp430G2553.h"
void i2c_init(unsigned char sla_add)
{
P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
UCB0CTL1 |= UCSWRST; // Enable SW reset
UCB0CTL0 = UCMST+UCMODE_3+UCSYNC; // I2C Master, synchronous mode
UCB0CTL1 = UCSSEL_2+UCSWRST; // Use SMCLK, keep SW reset
UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
UCB0I2CSA = sla_add; // Set slave address
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
}
void i2c_read(unsigned char AddRes,unsigned char datarev)
{
while (UCB0CTL1 & UCTXSTP); // Loop until I2C STT is sent
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition

while (!(IFG2&UCB0TXIFG));
UCB0TXBUF = AddRes; // Address start

while (!(IFG2&UCB0TXIFG));

UCB0CTL1 &= ~UCTR; // I2C RX
UCB0CTL1 |= UCTXSTT; // I2C start condition
IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag

while (UCB0CTL1 & UCTXSTT); // Loop until I2C STT is sent
while (!(IFG2&UCB0RXIFG));
datarev= UCB0RXBUF;
while (!(IFG2&UCB0RXIFG));

UCB0CTL1 |= UCTXSTP; // I2C stop condition after 1st TX

}
void i2c_write(unsigned char AddRes)
{
while (UCB0CTL1 & UCTXSTP); // Loop until I2C STT is sent
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition

while (!(IFG2&UCB0TXIFG));
UCB0TXBUF = AddRes;

while (!(IFG2&UCB0TXIFG)); //BI DUNG TAI DAY !!!!!!!!!!!!!
UCB0CTL1 |= UCTXSTP; // I2C stop condition after 1st TX
IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag
}

/*
* Chương Trình Chính
*/
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
Port_Init();
i2c_init(0xC0); //cmps03 address
i2c_write(0x00); //select register 1

//__bis_SR_register(GIE);
while(1)
{
i2c_read(0xc1, I2Cdataread); //read
}


}
Sau khi đổ code và debug thì bị dừng tại while (!(IFG2&UCB0TXIFG)) của hàm write, nghĩa là ko truyền đi được nhưng em không biết là do code hay do mạch nữa, em dùng trở 4k7 như các file huong dẫn cmp. Do CMP xài nguồn cấp 5v, còn MSP thì 3v3 nên em dùng pca9306 để bơm nó lên 5v nhưng hiệu quả vẫn như cũ. Mong các anh chị xem giúp em với :)
 

vodanhbk

Trứng gà
Mình cũng đang tập tành với MMA8452 và cũng bị tương tự, mình nghĩ con cảm biến nó không nhận dữ liệu, trong datasheet ghi thế này:
IFG2, Interrupt Flag Register 2:
UCB0TXIFG Bit 3 USCI_B0 transmit interrupt flag. UCB0TXIFG is set when UCB0TXBUF is empty.
0 No interrupt pending
1 Interrupt pending
 
Top