主题中讨论的其他器件: TMP100
请提供将 LSM6DS33与我的 MSP430G2553连接的代码。 我没有足够的备份来进行同样的操作
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
请提供将 LSM6DS33与我的 MSP430G2553连接的代码。 我没有足够的备份来进行同样的操作
您好、Jayakrishnan、
据我所知、 我们没有专门针对 MSPM0G2553和 LSM6DS33的任何官方示例、但似乎可以通过 I2C 或 SPI 来控制器件。
我们有一个将 MSP430G2553与 TMP100搭配使用的示例、网址 为:https://dev.ti.com/tirex/explore/node?node=A__ALJ6CcSCZehPN6QX8ONibw__msp430ware__IOGqZri__LATEST
以及此处的标准 I2C 控制器示例: https://dev.ti.com/tirex/explore/node?node=A__ADwdOVnX-fmCfnKgw9hv7Q__msp430ware__IOGqZri__LATEST
如果要使用 SPI、您将在 dev.ti.com 上的同一目录中找到 SPI 标准控制器示例。
这些示例中的任何一个都可以修改、并用于发送和接收来自 LSM6DS33的数据。
此致、
Brandon Fisher
#include <msp430g2553.h>
unsigned char RX_Data[6];
unsigned char TX_Data[2];
unsigned char RX_ByteCtr;
unsigned char TX_ByteCtr;
int xAccel;
int yAccel;
int zAccel;
unsigned char slaveAddress = 0x6A;
const unsigned char CTRL9_XL = 0x38; // Accelerometer X, Y, Z axes enabled
const unsigned char CTRL1_XL = 0x60; // Accelerometer = 416Hz (High-Performance mode)
const unsigned char INT1_CTRL = 0x01; // Accelerometer Data Ready interrupt on INT1
void i2c_start(void);
void i2c_write(unsigned char);
void i2c_read(unsigned char);
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stopping WDT
/*---------------------*/
UCB0CTL0 |= UCSSEL_3; // chooses SMCLK
UCB0RW = 10; // sets prescalar = 10
UCB0CTL0 |= ucmode_3; // puts into I2C mode
UCB0CTL0 |= UCMST; // puts into master mode
UCB0CTL0 &= ~UCTR; // puts into RX mode (read)
UCB0I2CSA = 0X6A; // slave address
UCBOCTL1 = UCASTP_2
// Set clock speed (default = 1 MHz)
BCSCTL1 = CALBC1_1MHZ; // Basic Clock System CTL (1,8,12 16_MHZ available)
DCOCTL = CALDCO_1MHZ; // Digitally-Controlled Oscillator CTL
// Setting I2C pins
P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
// Initialize the I2C state machine
i2c_start();
while (1)
{
slaveAddress = 0x6A; // slave address
TX_Data[0] = ;
TX_ByteCtr = 1;
i2c_write(slaveAddress);
// Read the two bytes of data and store them in zAccel
slaveAddress = 0x6A; // address
RX_ByteCtr = 6;
i2c_read(slaveAddress);
xAccel = RX_Data[5] << 8; // MSB
xAccel |= RX_Data[4]; // LSB
yAccel = RX_Data[3] << 8; // MSB
yAccel |= RX_Data[2]; // LSB
zAccel = RX_Data[1] << 8; // MSB
zAccel |= RX_Data[0]; // LSB
//print data
__no_operation(); // Set breakpoint >>here<< and read
}
}
void i2c_start(void)
{
// set up I2C module
UCB0CTL1 |= UCSWRST; // Enable SW reset
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
UCB0BR0 = 10; // fSCL = SMCLK/40 = ~400kHz
UCB0BR1 = 0;
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
}
void i2c_write(unsigned char slaveAddress)
{
__disable_interrupt();
UCB0I2CSA = slaveAddress; // Load slave address
IE2 |= UCB0TXIE; // Enable TX interrupt
while(UCB0CTL1 & UCTXSTP); // Ensure stop condition sent
UCB0CTL1 |= UCTR + UCTXSTT; // TX mode and START condition
__bis_SR_register(CPUOFF + GIE); // sleep until UCB0TXIFG is set ...
}
void i2c_read(unsigned char address)
{
__disable_interrupt();
UCB0I2CSA = address; // Load slave address
IE2 |= UCB0RXIE; // Enable RX interrupt
while(UCB0CTL1 & UCTXSTP); // Ensure stop condition sent
UCB0CTL1 &= ~UCTR; // RX mode
UCB0CTL1 |= UCTXSTT; // Start Condition
__bis_SR_register(CPUOFF + GIE); // sleep until UCB0RXIFG is set ...
}
/***********************************************************************************/
// USCIAB0TX_ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
if(UCB0CTL1 & UCTR) // TX mode (UCTR == 1)
{
if (TX_ByteCtr) // TRUE if more bytes remain
{
TX_ByteCtr--; // Decrement TX byte counter
UCB0TXBUF = TX_Data[TX_ByteCtr]; // Load TX buffer
}
else // no more bytes to send
{
UCB0CTL1 |= UCTXSTP; // I2C stop condition
IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}
}
else // (UCTR == 0) // RX mode
{
RX_ByteCtr--; // Decrement RX byte counter
if (RX_ByteCtr) // RxByteCtr != 0
{
RX_Data[RX_ByteCtr] = UCB0RXBUF; // Get received byte
if (RX_ByteCtr == 1) // Only one byte left?
UCB0CTL1 |= UCTXSTP; // Generate I2C stop condition
}
else // RxByteCtr == 0
{
RX_Data[RX_ByteCtr] = UCB0RXBUF; // Get final received byte
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}
}
}您好、Jayakrishnan、
第一步是将其放入 MSP430G2553的 CCS 项目中、可以是独立的 Code Composer Studio (https://www.ti.com/tool/CCSTUDIO)或基于云的 Code Composer Studio 工具(dev.ti.com/ide)。
如果您完全不熟悉 I2C、还可以查看我们的 MSP430 I2C Academy: https://dev.ti.com/tirex/explore/node?node=A__AN8bTD5cSL1aI5MBrThs3A__com.ti.MSP430_ACADEMY__bo90bso__LATEST
此致、
Brandon Fisher