STC15W通过SPI方式读取RM3100数据


二维码是我创建的QQ群,欢迎新朋友加入。

近日接手一个项目,要求在STC单片机上面读取RM3100的数据,淘宝看了下,还真不便宜。


这个东西本身难度不是很大,麻烦的是没有什么参考资料,就官网那点东西。


程序思路很简单,调SPI通信,调初始化设置。

查看数据手册,这些寄存器都是可以被设置的,还好,不算太多。


也没必要全都设置一遍,只需要把需要的设置一下就行,我的话主要是设置了连续测量和转换周期。




/**
 *  @brief  Sets cycle count and updates gain and max_data_rate values
 *  @param[in]  desire value PNI recomends values between 30 and 400 Hz
 *  @return     1 if successful, 0 otherwise.
 */
void setCycleCount ( u16 value ) 
{
	char to_reg[6];

	if (value > 400)
			value=400;
	else if (value < 30)
			value=30;

	to_reg[0] = value>>8;
	to_reg[1] = value;
	to_reg[2] = to_reg[0];
	to_reg[3] = to_reg[1];
	to_reg[4] = to_reg[0];
	to_reg[5] = to_reg[1];

	SPIWriteBytes(M3D_3100_CCX,6,to_reg);
}

/**
 *  @brief  Sets data rate in Continuous Measurement Mode.
 *  Fails if desire datarate is higher than the max data rate recommended by PNI.
 *  @param[in]  Data rate configuration BYTE
 *  @return     1 if successful, 0 otherwise.
 */
void setCMMdatarate ( char conf ) 
{
	char *ptr;
	float temp = 1000;

	switch (conf){
			case CMM_UPDATERATE_600: temp=600;
															break;
			case CMM_UPDATERATE_300: temp=300;
															break;
			case CMM_UPDATERATE_150: temp=150;
															break;
			case CMM_UPDATERATE_75 : temp=75;
															break;
			case CMM_UPDATERATE_37 : temp=37;
															break;
			case CMM_UPDATERATE_18 : temp=18;
															break;
			case CMM_UPDATERATE_9  : temp=9;
															break;
			case CMM_UPDATERATE_4_5: temp=4.5;
															break;
			case CMM_UPDATERATE_2_3: temp=2.3;
															break;
			case CMM_UPDATERATE_1_2: temp=1.2;
															break;
			case CMM_UPDATERATE_0_6: temp=0.6;
															break;
			case CMM_UPDATERATE_0_3: temp=0.3;
															break;
			case CMM_UPDATERATE_0_15: temp=0.15;
															break;
			case CMM_UPDATERATE_0_075: temp=0.075;
															break;
	}

	ptr = &conf ;
	
	SPIWriteBytes(M3D_3100_TMRC,1,ptr);
}

设置之后就是对数据的读取


/**********************/
/***** ¶ÁÈ¡Êý¾Ý ******/
/**********************/
void MagGetData(void) 
{ 	
	int i = 0;
	unsigned char temp[9]={0};
	static long Mag_Data[3]={0};
	static char state = 0;  //0 :cmd  1:wait get data
	static char cNoDataCnt = 0;
	if (CheckMagDataReady())
	{
		//´«¸ÐÆ÷×¼±¸ºÃ´¦ÀíÊý¾Ý
		state = 0;
		//¶ÁÈ¡Êý¾Ýµ½Êý×é
		SPIReadBytes(0xA4,9,temp);
		
		//Êý¾Ý¼ÆËã
		Mag_Data[0]=temp[0]<<16 | temp[1]<<8 | temp[2];			//ned×ø±êϵ--Ç°ÌáÊÇËùÓк¸½Ó¶¼ÊDZê¼Çλº¸½Óµ½N
		Mag_Data[1]=temp[3]<<16 | temp[4]<<8 | temp[5];
		Mag_Data[2]=temp[6]<<16 | temp[7]<<8 | temp[8];

		for(i=0;i<3;i++)
		{
			if(Mag_Data[i]&0x00800000)
				Mag_Data[i]|=0xff000000;
		}
		
		temp[0]=0x70;
		SPIWrite(0,0x70);
	}
	else
	{
		//´«¸ÐÆ÷»¹Ã»×¼±¸ºÃ´¦ÀíÊý¾Ý
		cNoDataCnt+=5;
		if (cNoDataCnt>=20)
		{
			cNoDataCnt=0;
			SPIWrite(0,0x70);
		}
	}
	
	//Êý¾ÝתÒƵ½½á¹¹Ìå
	rm3100.rx = Mag_Data[0];
	rm3100.ry = Mag_Data[1];
	rm3100.rz = Mag_Data[2];
	
	//´®¿Ú´òÓ¡ÈýÖá²ÎÊý
	printf("´Å³¡Ç¿¶È\r\n");
	printf("XÖá:%ld\r\n",rm3100.rx);
	printf("YÖá:%ld\r\n",rm3100.ry);
	printf("ZÖá:%ld\r\n",rm3100.rz);
	
}

完成之后,就可以通过串口打印出当前测量的磁场强度


二维码是我创建的QQ群,欢迎新朋友加入。

猜你喜欢

转载自blog.csdn.net/jun626/article/details/80957721
今日推荐