主题中讨论的其他器件: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)