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.

[参考译文] TM4C1290NCPDT:在 Energia 中与 MMA8452Q 进行 I2C 通信时急需帮助

Guru**** 2463330 points
Other Parts Discussed in Thread: ENERGIA

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/654244/tm4c1290ncpdt-need-desperate-help-with-i2c-communication-with-mma8452q-in-energia

器件型号:TM4C1290NCPDT
主题中讨论的其他器件:Energia

大家好、我目前正在进行一个涉及 Energia 内部 MMA8452Q 加速计的项目、但由于某种原因、它将无法工作、甚至无法从 WH_AM_I 寄存器读取0x2A。

急需帮助,非常感谢!

我正在使用 I2C 模块0 (PB2和 PB3)、下面是我的代码!

在我的循环内、我应该读取 x y z 数据、但为了测试 WAND_AM_I 寄存器、我在那里有一些虚拟代码。

#include //用于 I2C

#define SA0 1
#if SA0
#define MMA8452_address 0x1D // SA0为高电平, 0x1C 如果为低
#else
#define MMA8452_ADDRESS 0x1C
#endif

//定义我们将在 MMA8451上访问的一些寄存
器#define OUT_X_MSB 0x01
#define XYZ_DATA_CFG 0x0E
#define WOUT_AM_I 0x0D
#define CTRL_REG1 0x2A

#define GSCALE + 4、设置为全范围4或全范围4 / 4 / 4。 用于计算实数 g 值。

易失性字节值;

void setup()
{
Serial.begin(115200);
Serial.println ("MMA8452基本示例");
Wire.setModule(0);
delay (10);
Wire.begin(); //将总线作为主
延迟(10)加入;
Serial.println (readRegister (WHO_AM_I));
initMMA8451 ();//测试并初始化 MMA8451
}

void loop()
{
Wire.beginTransmission(MMA8452_ADDRESS);
Wire.write(byte) 0x0D);
Wire.endTransmission (false);
Wire.requestfrom (MA8452);地址: //ask for 1 byte,一旦完成,总线默认被释放
while (!Wire.available ());//等待数据返回
值=(byte) Wire.read ();
Serial.println (value);
delay (1000);//此处延迟以查看
}

void readAccelData (int * destination)
{
byte RawData[6];/rawx_Data

寄存器;//此处存储在此处// //将六个原始数据寄存器读入数据数组

短 x =((short)(RawData[0]<8 | RawData[1])>> 4;
短 y =(short)(RawData[2]<<8 | RawData[3])>> 4;
短 z =(short)(RawData[4]<<8);串

行数据
延迟(1000)>(1000)
;串行
延迟(1000);
serial.println (z);
delay (1000);

//循环计算每个轴的12位 ADC 和 g 值
// for (int i = 0;i < 3;i++)
//{
// int gcount =(RawData[i*2]<< 8)| RawData[(i *2)+1];//将
一个8位/gcount 组合成两个寄存器/个8位 //寄存器左对齐,这里我们右对齐14位整数
//
////如果数字为负数,我们必须手动进行(无12位数据类型)
// if (RawData[I*2]>0x7F)
//
gcount =~gcount + 1;
// gcount *=-1;//转换为负二进制补码#
//}
//
//////目的地[i]= gcount;//将此 gcount 记录到3个 int 数组
//}



void initMMa8451 ()
{
MMa8451Standby (); //必须处于待机状态才能更改寄存器

//将满量程范围设置为2、4或8g。
字节 fsr = GSCALE;
if (fsr > 8) fsr = 8;//轻松错误检查
writeRegister (XYZ_DATA_CFG、fsr);

//默认数据速率为800Hz,我们不在本示例代码

MMAR8451Active ()中修改它;//设置为活动以开始读取
}

//将 MMA8451设置为待机模式。 它必须处于待机状态才能更改大多数寄存






器设置 void MMa8451Standby (){字节 c = readRegister (CTRL_REG1);writeRegister (CTRL_REG1、c &~(0x01));//清除活动位以进入待机状态}//将 MMA8451设置为活动模式。 需要处于此模式才能输出数据
void MMa8451Active ()
{
字节 c = readRegister (CTRL_REG1);
writeRegister (CTRL_REG1、c | 0x01);//将活动位设置为开始检测
}

//按顺序读取字节 ToRead、从 address 开始读取到目标数组
void readRegisters (

Wire.beginTransmission(MMA8452_ADDRESS);、字节)
Wire.write (addresssToRead);
Wire.endTransmission (false);//endTransmission 但保持连接处于活动

状态 Wire.requestFrom (MMA8452_address、bytesToRead);//询问字节,完成后,总线默认被释放

,而(Wire.available ()< bytesToRead);//挂起,直到我们得到

x +字节;x +(x +);
dest[x]= Wire.read();
}

//从 addressToRead 中读取一个字节并将其作为字节
字节读取寄存器(字节 addressToRead)返回
{
Wire.beginTransmission(MMA8452_ADDRESS);
Wire.write (addressToRead);
delay (10);
Wire.endTransmission (false);

Wire.requestFrom (MMA8452_address、 1);//ask for 1 byte,一旦完成,总线将被默认释放

while (!Wire.Available ());//等待数据返回
Wire.read();//返回这一个字节
}

//将一个字节(dataToWrite)写入 addresssToWrite
void writeRegister (addresssToWrite,byte dataToWrite);
//
addressToWrite


(addressToWrite,byte) Transmission (Wire.beginTransmission(MMA8452_ADDRESS););/ addressed.Write) Transmission (addressed.Write)(addressed.Write)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感受您的痛苦-并赞扬您避免"紧急"或"期望"我们(很少)的论坛用户"放弃我们正在做的事情"、并急于获得"优步特权"海报(立即-如果不是更早)所需的! (全部)

    您选择的"绝望"很好地定义了(您的)状况-但不会将自己(同样)强加给无电帮助者 crüe。

    故障排除(任何)此类串行接口始终通过使用示波器极大地"加速、增强了"、这可以快速揭示是否有任何信号从 MCU 逃逸。   唉——你说“没有提到”。

    需要上拉电阻器- 4K7 - 10K (请勿争论)、并应出现在2条 I2C 信号线上的每条线上。   (数据和时钟)  是否存在?   当您不通过 I2C 进行转换时、两条信号线是否都"返回到接近3V3"?

    在这里(本论坛)、您很少知道、甚至是"关心"、"L0-Energia"、您是否曾向该论坛或帮助提供商指示过类似的"绝望"?

    FiRM /我相信(非常)在"吻"中、对于您(假设)的第一个动作、您选择了一座高山-您不是吗?   KISS -最能为您带来成功-要求您从更简单、小容量、基于 I2C 的 EEPROM 开始。   您更复杂的器件只是呈现"变量过多"-对于任何"第一次攻击!"而言、完全不合适!   (即使(当然)"了解得更好"的人默示地鼓励了(尤其是)。)

    您是否认真回顾过 Lo-Energia -肯定有人发布了"声称在工作"的(某些内容)。   

    再说一次-感觉您的痛苦无法实现快速/轻松的解决方案-当任务涉及到如此复杂的器件时-并且"一系列糟糕、过于乐观的选择"导致了您的"绝望"-这是不是吗?   人们必须问,为什么会这样呢?    

    学到的教训-尽早开始-(即使是恐惧-尤其是恐惧!)    渴望尽早、经常地向最可能提供帮助的利益相关者寻求帮助。   "现实是一种(有时)残忍的教师-但(有些)课程必须"造成痛苦"-导致"改进未来的努力..."

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    学家您好!

    就您发布的软件而言、我们没有任何 Energia 经验来审核您的代码并就任何可能的错误提供任何反馈。 您需要访问 Energia 论坛以获取相关帮助、论坛链接为 :https://forum.43oh.com/forum/125-energia-tivaccc3xxx/

    CB1对硬件提出了一些很好的建议、但请跟进您对他关于硬件方面的建议的发现、如上拉电阻器。 至少在硬件层面、我们可以帮助您确信您的设置正常、然后您可以通过上面提到的 Energia 论坛关注软件。