工具/软件:Code Composer Studio
您好!
我正在尝试使用 I2C 与 ADXL345进行通信、但无法以任何身份发送或接收数据。 我已经连接了一个逻辑分析仪、无论我要传输什么、都能获得相同的数据、而且数据非常随机。 我使用了 MSP432随附的 I2C 示例代码、甚至在逻辑分析仪上运行该代码、在该分析仪上我会得到随机不清楚的数据。
我在下面附上了我的代码。 如果您有任何建议或帮助、请告诉我、我真的需要它!
- /*
- * i2c.c
- *
- * 创建 日期: 2017年11月18日
- * 作者: noamargalit
- *
- //从( 加速计)
- //主 控方(msp432p401r)
- #include "msp.h"
- #include "i2cmaster.h"
- #define PWR_CTRL 0x2D
- volatile uint8_t rxbuf[6];
- uint8_t *rxdata;
- volatile uint8_t transmit [2];
- void i2c_data_transmission (){
- uint8_t i;
- P1->SEL0 |= BIT6 | BIT7;
- __ENABLE_IRQ();
- //通电 :
- I2C_Receive_configure ();
- I2C_Transmit 配置();
- Transmit 两个数据(0x00、PWR_CTRL); //唤醒
- while (EUSCI_B0->CTLW0 和 EUSCI_B_CTLW0_TXSTP);
- Transmit 两个数据(0x10、 PWR_CTRL); //自动 睡眠
- while (EUSCI_B0->CTLW0 和 EUSCI_B_CTLW0_TXSTP);
- Transmit 两个数据(0x08、 PWR_CTRL); //测量 数据
- while (EUSCI_B0->CTLW0 和 EUSCI_B_CTLW0_TXSTP);
- while (1){
- uint8_t test_BYTE = (0x32<1) + 1; //发送 读取 请求 到 地址 0x32: x_data 的寄存器
- uint8_t datarequest = 0x32;
- //transmit array (&test_Byte、 1); //数据 请求
- Transmit _One_data (test_Byte);
- for (i=0; i < 20; i++);
- while (EUSCI_B0->CTLW0 和 EUSCI_B_CTLW0_TXSTP);
- receive_data();
- while (EUSCI_B0->CTLW0 和 EUSCI_B_CTLW0_TXSTP);
- // EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTP;// 结束后停止
- *
- }
- }
- void i2c_transmit 配置(){
- EUSCI_B0->CTLW0 = EUSCI_A_CTLW0_SWRST;
- EUSCI_B0->CTLW0 = EUSCI_B_CTLW0_MODE_3 | EUSCI_B_CTLW0_SYNC | EUSCI_B_CTLW0_ssel_SMCLK;
- EUSCI_B0->CTLW0 &= ~EUSCI_B_CTLW0_SWRST;
- EUSCI_B0->IE |= EUSCI_B_IE_TXIE0;
- }
- void i2c_receive_configure (){
- EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST; //复位 状态
- EUSCI_B0->CTLW0 = EUSCI_B_CTLW0_MST | EUSCI_B_CTLW0_SYNC | EUSCI_B_CTLW0_ssel_SMCLK; //主控、同步、SMCLK 模式
- EUSCI_B0->CTLW1 |= EUSCI_B_CTLW1_ASTP_2; // 达到 阈值时自动停止
- EUSCI_B0->CTLW1 |= EUSCI_B_CTLW1_SWACK;
- EUSCI_B0->BRW = 30; //使用 SMCLK 的波特率
- EUSCI_B0->TBCNT = 6; 每个 方向接收到/6个字节
- EUSCI_B0->CTLW0 &= ~EUSCI_B_CTLW0_SWRST;
- EUSCI_B0->IE |= EUSCI_B_IE_RXIE0| EUSCI_B_IE_NACKIE; // 我 是否需要 其他 中断? NACK? EUSCI_B_IE_NACKIE 字节 计数器?
- }
- void transmit 两个数据(uint8_t 用途、 uint8_t power_control){
- Transmit [0] = 用途;
- Transmit [1] = power_control;
- EUSCI_B0->I2CSA = (0x53 <<1 )| I2C_READ;
- while (EUSCI_B0->CTLW0 和 EUSCI_B_CTLW0_TXSTP); //发送 停止 条件
- EUSCI_B0->CTLW0 |= UCTR;
- EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTT; //开始 发送
- NVIC_EnableIRQ (EUSCIB0_IRQn); //输入 中断 处理程序
- }
- void transmit 一个数据(uint8_t data){
- 发送[0] = 数据;
- while (EUSCI_B0->CTLW0 和 EUSCI_B_CTLW0_TXSTP);
- EUSCI_B0->I2CSA = (0x53 <<1 )| I2C_READ;
- EUSCI_B0->CTLW0 |= UCTR;
- EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTT;
- NVIC_EnableIRQ (EUSCIB0_IRQn);
- }
- void receive_data (void){
- rxdata = (uint8_t *) rxbuf;
- while (EUSCI_B0->CTLW0 和 EUSCI_B_CTLW0_TXSTP);
- EUSCI_B0->CTLW0 &= ~UCTR;
- EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTT;
- NVIC_EnableIRQ (EUSCIB0_IRQn);
- }
- void EUSCIB0_IRQHandler (void){
- IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_NACKIFG)
- {
- EUSCI_B0->IFG &= ~ EUSCI_B_IFG_NACKIFG; //检查 从器件接收到的 NACK 标志 是否 发生 这种情况,txbuf 是否被清除
- EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTT; //完成 重新启动 条件
- IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_TXIFG0) //检查 TX 标志
- {
- EUSCI_B0->TXBUF = 发送[0];
- EUSCI_B0->CTLW0 &= ~EUSCI_B_CTLW0_TXSTT;
- }
- }
- 否则 {
- EUSCI_B0->TXBUF = 0x00;
- EUSCI_B0->CTLW0 &= ~EUSCI_B_CTLW0_TXSTT;
- EUSCI_B0->IFG |= EUSCI_B_IFG_TXIFG0;
- }
- IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_RXIFG0)
- {
- EUSCI_B0->IFG &= ~EUSCI_B_IFG_RXIFG0; //清除 标志
- *rxdata++ = EUSCI_B0->RXBUF;
- }
- IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_TXIFG0)
- {
- EUSCI_B0->TXBUF = 发送[0];
- UCB0IFG &= ~UCTXIFG;
- }
- }
