~(0x2f)&0x36

本文通过一个具体的Java代码示例,详细解析了按位运算符的使用方法及其运算过程,包括取反、按位与等操作,并展示了如何将十六进制转换为二进制进行按位运算。

运算

public class Test{   
public static void main(String args[])
{       
int  n = ~(0x2f)&0x36; 
System.out.println(n); 
 } 
}
今天在复习面试的题目无意间看到这题并做下记录以便后面
1、按位运算符就是直接对整数在内存中的二进制位进行操作运算。比如,&&运算本来是一个逻辑运算符,但整数与整数之间可以用&进行运算。举个例子,6的二进制是110,11的二进制是1011,那么6 & 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。

2、C语言提供了六种按
位运算符:


& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移

>> 右移

以0x开头的是十六进制(十六进制中:a-f依次表示10-15,0x2f就是十六进制2f,即十进制47,0x36就是十进制的54

0开头的就是八进制

然后他们的二进制分别为
0x2f  101111
0x36 110110
题目中~(0x2f)所以要先算里面的而~就是要把二进制取反,也就是把0变成1,1变成0
   ~(0x2f) 010000
&      0x36    110110
------------------------
                    010000
也就是十进制的16
最后n输出的结果是16。
UDS 安全访问认证中应用如下算法和秘钥: a) Hash 算法:SHA256; b) 加解密算法:AES128-ECB PKCS5 填充; c) 密钥因子:各 ECU 需对诊断或刷写的安全访问认证密钥因子进行安全保护,用于进行安全访问认证过程中加密计算和解密计算。 byte SecurityAES128KEY1[16] = {0xDC,0x6C,0x22,0x0A,0x21,0x6A,0xBB,0xDE,0x9C,0xB6,0x5B,0xE7,0x2E,0x9A,0x1C,0xA6}; byte SecurityAES128KEY3[16] = {0x3C,0xCD,0x60,0xB9,0xF0,0x21,0xD7,0x39,0xD4,0x1B,0xF0,0x76,0x3D,0x0E,0x7A,0xFA}; 流程如下: 1.使用 4 字节 Seed 进行 SHA256 计算,产生 32 字节 Hash 值 Seed。 2.随后拼接 32 字节 Seed'与 16 字节秘钥因子,并对拼接值进行 SHA256 计算,产生 32 字节的Hash 值,截取前 16 字节作为密钥 K; 3.密钥 K 通过 AES128 加密算法对 4 字节 Seed 进行加密,得到 16 字节的认证数据Key 基于以上描述,参考以下capl代码,给出密钥认证完整代码 variables { long gHandle; long gDataLength;//Use to store the number of Tx/Rx data byte gTxBuffer[1000];//500 byte gRxBuffer[1000]; int gSecurityLevel=1; byte FLZCU_SecurityAES128KEY1[16]= {0x96,0xCB,0x1B,0xBF,0x02,0xDF,0x05,0x10,0xF5,0x21,0x9C,0xCE,0x67,0x9B,0x98,0xFA}; byte FLZCU_SecurityAES128KEY11[16]= {0x1A,0xF0,0x69,0xCD,0x52,0x1B,0xF9,0x70,0xE8,0xDC,0x8E,0xC6,0xBB,0x24,0x62,0x8D}; byte RZCU_SecurityAES128KEY1[16]= {0x27,0xBB,0x7B,0x9F,0xAA,0x4D,0xEC,0x13,0x32,0x7A,0x7C,0x2F,0xF7,0xFA,0xA1,0x9A}; byte RZCU_SecurityAES128KEY11[16]= {0xA7,0x34,0xD1,0x55,0xA9,0x6A,0xA4,0x09,0xDB,0x93,0x3F,0x74,0x75,0xF9,0x35,0xE9}; byte seedArray[16]; byte keyArray_CMAC[16];//output dword keyArray_CMAC_LEN=16; enum {Security,WriteCCP,ReadCCP,None}gDiagnosticFlag=None; } /*===========================================================================*\ * * Create CAN channel connection. * \*===========================================================================*/ long CreateCANFDConnection( dword txId, dword rxId) { gHandle = CanTpCreateConnection(0); // normal mode CanTpSetTxIdentifier( gHandle, txId); CanTpSetRxIdentifier( gHandle, rxId); CanTpSetMaxCANFDFrameLength( gHandle, 64); // activate CAN FD // CanTpSetPadding( gHandle, -1); return gHandle; } //Calculate AES128 CMAC for SecurityLevel, ECU: RZCU void SecurityCalculateAES128KeyResp_ZCUR(byte seedIn[],byte keyOut[], byte levelIn) { if(levelIn==1) { SecurityLocalGenerateCMAC(RZCU_SecurityAES128KEY1,elCount(RZCU_SecurityAES128KEY1),seedIn,elCount(seedIn),keyOut,keyArray_CMAC_LEN); } else if(levelIn==0x11) { SecurityLocalGenerateCMAC(RZCU_SecurityAES128KEY11,elCount(RZCU_SecurityAES128KEY11),seedIn,elCount(seedIn),keyOut,keyArray_CMAC_LEN); } } //Calculate AES128 CMAC for SecurityLevel, ECU: LZCU void SecurityCalculateAES128KeyResp_ZCUL(byte seedIn[],byte keyOut[], byte levelIn) { if(levelIn==1) { SecurityLocalGenerateCMAC(FLZCU_SecurityAES128KEY1,elCount(FLZCU_SecurityAES128KEY1),seedIn,elCount(seedIn),keyOut,keyArray_CMAC_LEN); } else if(levelIn==0x11) { SecurityLocalGenerateCMAC(FLZCU_SecurityAES128KEY11,elCount(FLZCU_SecurityAES128KEY11),seedIn,elCount(seedIn),keyOut,keyArray_CMAC_LEN); } }
09-05
/********************************************************** �����Ƽ� ������������뵽�Ա��꣬�������ӽ߳�Ϊ������ ^_^ https://kvdz.taobao.com/ **********************************************************/ #include "HMC830.H" uint8_t mode = 0, lock = 0; unsigned char dat_reg[4]={0}; unsigned char rfDividReg[3] = {0X00, 0XE0, 0X90}; uint32_t REG0_830 = 0x400A7975; //X RD a5-a0 d23-d0 0 1 00_0000 0000 1010 0111 1001 0111 0101 //uint32_t REG0_830 = 0x800A7975; //X RD a5-a0 d23-d0 0 1 00_0000 0000 1010 0111 1001 0111 0101 uint32_t REGF0_830 = 0x0F0000C0; //X /WR a5-a0 d23-d0 0 0 00_1111 0000 0000 0000 0000 1100 0000 uint32_t REGF1_830 = 0x0F0000E0; //X /WR a5-a0 d23-d0 0 0 00_1111 0000 0000 0000 0000 1110 0000 uint32_t REG12_830 = 0x52000000; //X RD a5-a0 d23-d0 0 1 01_0010 0000 0000 0000 0000 0000 0000 void Hmc830Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //ʹ��PC�˿�ʱ�� HMC830_SCK = 1; HMC830_SEN = 0; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //������� GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO���ٶ�Ϊ50MHz GPIO_Init(GPIOC, &amp;GPIO_InitStructure); //�����趨������ʼ��GPIOE HMC830_CEN = 1; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //IO���ٶ�Ϊ50MHz GPIO_Init(GPIOC, &amp;GPIO_InitStructure); //�����趨������ʼ��GPIOE delay_ms(20); } void delay(unsigned int num) { unsigned char i; unsigned int j; for(i=0;i<100;i++) for(j=0;j<num;j++); } void nop(unsigned int num) { while(num) num--; } void spi_wr(unsigned char dat,unsigned char *p) { unsigned char i,j; unsigned char dat_reg; HMC830_SEN = 1; dat=dat<<3; for(j=0;j<3;j++) { dat_reg=*p; for(i=0;i<8;i++) { if(dat_reg &amp; 0X80) HMC830_SDI = 1; else HMC830_SDI = 0; dat_reg <<= 1; nop(50); HMC830_SCK=0; nop(50); HMC830_SCK=1; nop(50); HMC830_SCK=0; nop(50); } p++; } HMC830_SEN = 0; nop(100); for(i=0;i<5;i++) { if(dat &amp; 0X80) HMC830_SDI = 1; else HMC830_SDI = 0; dat<<=1; HMC830_SCK=0; nop(50); HMC830_SCK=1; nop(50); HMC830_SCK=0; nop(50); } for(i=0;i<3;i++) { HMC830_SDI=0; HMC830_SCK=0; nop(50); HMC830_SCK=1; nop(50); HMC830_SCK=0; nop(50); } HMC830_SEN=0; nop(50); HMC830_SEN=1; nop(50); HMC830_SEN=0; nop(50); } void hmc830_ini(unsigned char *p) { unsigned char dat_reg[3]={0}; unsigned char dat0; unsigned char dat1; unsigned char dat2; unsigned char dat3; dat0 = *p; p++; dat1 = *p; p++; dat2 = *p; p++; dat3 = *p; dat_reg[0]=0x00; dat_reg[1]=0x00; dat_reg[2]=0x20;//2; spi_wr(0x00,dat_reg); dat_reg[0]=0x00; dat_reg[1]=0x00; dat_reg[2]=0x02;//2; spi_wr(0x01,dat_reg); dat_reg[0]=0x00; dat_reg[1]=0x00; dat_reg[2]=0x01;// spi_wr(0x02,dat_reg);//R��Ƶ����100M����0x01��50M 0x02�� 25M0x04 // dat_reg[0]=0x00;//0x50; // dat_reg[1]=0xF3; //38��Ƶ // dat_reg[2]=0x10; //e090 // spi_wr(0x05,dat_reg);//���1��Ƶ��E090 2��Ƶ E110 4��ƵE210 dat_reg[0]=rfDividReg[0];//0x50; dat_reg[1]=rfDividReg[1]; //1��Ƶ dat_reg[2]=rfDividReg[2]; //e090 spi_wr(0x05,dat_reg);//���1��Ƶ��E090 2��Ƶ E110 4��ƵE210 // dat_reg[0]=0x00;//0x50; // dat_reg[1]=0xFF; //62��Ƶ // dat_reg[2]=0x10; //e090 // spi_wr(0x05,dat_reg);//���1��Ƶ��E090 2��Ƶ E110 4��ƵE210 dat_reg[0]=0x00; dat_reg[1]=0x28; dat_reg[2]=0x98; spi_wr(0x05,dat_reg);//vco04 fo: 0x2a95; 2f0:0x2295; dat_reg[0]=0x00;//0x50; dat_reg[1]=0x00; dat_reg[2]=0x00; spi_wr(0x05,dat_reg);//vco00 dat_reg[0]=0x20;//20 dat_reg[1]=0x0B;//0b dat_reg[2]=0x4A;//����ģʽ 0xcA;С��ģʽ 0x4a spi_wr(0x06,dat_reg);//����Ƭ��ģʽ dat_reg[0]=0x00; dat_reg[1]=0x0C;//0X01; dat_reg[2]=0xCD; spi_wr(0x07,dat_reg); dat_reg[0]=0x54;//0x54; dat_reg[1]=0x3F;//0x7f; dat_reg[2]=0xFF;//0xff; spi_wr(0x09,dat_reg);//��ʼ����400FFF--5FFFFF dat_reg[0]=0x00; dat_reg[1]=0x20; dat_reg[2]=0x46; //2005 spi_wr(0x0A,dat_reg);//Reg 0Ah CP Op Amp Register [2] dat_reg[0]=0x00; dat_reg[1]=0x00; dat_reg[2]=0x81;// //dat_reg[2]=0XE0;// spi_wr(0x0F,dat_reg);// dat_reg[0]=0x00; dat_reg[1]=0x00; dat_reg[2]=dat0; spi_wr(0x03,dat_reg); //������������ dat_reg[0]=dat3; dat_reg[1]=dat2; dat_reg[2]=dat1; spi_wr(0x04,dat_reg); //������������ } /* ********************************************************************************************************* * �� �� ��: WriteAFre * ����˵��: ����VCO����Ƶ�ʣ����VCO��Ƶ�����ã���ʵ��25M~3G��� * �� �Σ�_fre VCO����Ƶ�ʣ���λKHz����ΧΪ 1500000~3000000 * �� �� ֵ: �� * �� ��: �������ӣ�https://kvdz.taobao.com/ * ʱ ��: 2016/04/18 * �� ע: VCO��Ƶ�����òμ�"HMC830.C"��147~161�� ********************************************************************************************************* */ void WriteAFre(unsigned long int fre) { unsigned long int fsysclk = 50000000;//50000000; //����Ƶ��50M/25M/100M unsigned long int data_24 = 0xFFFFFF; unsigned long int fdout; unsigned long int fdout1; unsigned long int res0,res1,sum0,sum,k; unsigned char j,i; Hmc830Config(); delay(50); fdout = fre; fdout = fdout*1000; fdout1 = fdout*1; //4��Ƶ *4 //2��Ƶ *2 dat_reg[0] = fdout1/fsysclk; // fsysclk=����Ƶ��50M/25M/100M fdout = fdout1%fsysclk; sum=data_24/fsysclk; res0=data_24%fsysclk; sum=fdout*sum; for(i=0;i<7;i++) { j=i+1; k=1; while(j>0) { k=10*k; j--; } res1=res0%(fsysclk/k); res0=res0/(fsysclk/k); sum0=(res0*fdout)/k; res0=res1; if((res0>4)&amp;&amp;(res0<10)) sum=sum+1; sum=sum+sum0; } dat_reg[1] = sum; sum>>=8; dat_reg[2] = sum; sum>>=8; dat_reg[3] = sum; hmc830_ini(dat_reg); delay(50); } /* ********************************************************************************************************* * �� �� ��: HMC830_hmc_read * ����˵��: HMC830оƬID��ȡ * �� �Σ�REG��оƬID���˴�Ĭ��Ϊ����0x400A7975 * �� �� ֵ: �� * �� ��: �������ӣ�https://kvdz.taobao.com/ * ʱ ��: 2019/05/05 * �� ע: �������оƬID����ȡ��ȷ�������ID_D:686453 ID:A7975�� ********************************************************************************************************* */ void HMC830_hmc_read(uint32_t REG) { uint8_t i; uint32_t PLL_REG = REG; #ifdef DEBUG uint8_t *p = (uint8_t *)(&amp;PLL_REG); //���� #endif // wdt_reset(); HMC830_SEN = 0; delay_ms(10); HMC830_SEN = 1; //If a rising edge on SEN is detected first HMC Mode is selected. delay_ms(10); //SEN to SCLK setup time > 8ns for (i = 0; i < 7; i++) //b. The slave (PLL with Integrated VCO) reads SDI on the 1st rising edge of SCLK after SEN. SDI high initiates the READ cycle (RD) { //d. Slave registers the address bits on the next six rising edges of SCLK (2-7). PLL_REG <<= 1; //��λ������Ч������ HMC830_SCK = 0; //HMC830ʱ�� if ((PLL_REG &amp; 0x80000000) == 0) { HMC830_SDI = 0; //HMC830���� } else { HMC830_SDI = 1; } delay_us(5); //SDI to SCLK setup time > 3ns HMC830_SCK = 1; delay_us(5); //SCLK to SDI hold time > 3ns } HMC830_SCK = 0; //HMC830ʱ�� HMC830_SDI = 0; //HMC830���� delay_us(5); PLL_REG = 0x00000000; //��HMC830���� for (i = 0; i < 24; i++) //f. Host registers the data bits on the next 24 falling edges of SCK (8-31). { PLL_REG <<= 1; HMC830_SCK = 1; delay_us(5); //SCLK to SDO delay > 8.2ns+0.2ns/pF if (Read_LOCK_830_PLL0()) { PLL_REG |= 0x00000001; //HMC830���� } else { PLL_REG &amp;= ~0x00000001; //HMC830���� } HMC830_SCK = 0; //HMC830ʱ�� delay_us(5); } HMC830_SCK = 1; delay_us(5); HMC830_SCK = 0; //HMC830ʱ�� delay_ms(10); //Recovery Time > 10ns HMC830_SEN = 0; //h. Deassertion of SEN completes the cycle delay_ms(20); //SEN low duration > 20 ns if(REG == REG0_830) { if(PLL_REG == 0x000A7975) { printf("ID_D:%d\t", PLL_REG); mode = 0xEF; //hmc_mode } } else { if(PLL_REG &amp; 0x00000002) { lock = 0x01; } else { lock = 0x00; } } #ifdef DEBUG //// SendStrData(p + 3, 1); //���� //// SendStrData(p + 2, 1); //���� //// SendStrData(p + 1, 1); //���� //// SendStrData(p, 1); //���� printf("ID:%X\r\n", PLL_REG); #endif } /* ********************************************************************************************************* * �� �� ��: Hmc830FreWrite * ����˵��: ֱ�����25M~3G��Ƶ * �� �Σ�wfre�����Ƶ��ֵ����λ��kHz * �� �� ֵ: �� * �� ��: �������ӣ�https://kvdz.taobao.com/ * ʱ ��: 2016/04/18 * �� ע: ������Ҫ�������Ƶϵ���������䱶Ƶ����Χ1~62����VCO��Ƶϵ�������Ӷ�ʵ�������Ƶ����� ********************************************************************************************************* */ void Hmc830FreWrite(unsigned long long int wfre) { u16 vco02reg = 0X6010; u16 rfdivid = 1; u8 noise_con = 0; unsigned long int vco_fre; if(wfre > 3000000) wfre = 3000000; if(wfre < 25000) wfre = 25000; if(wfre > 1500000) { rfdivid = 1; } rfdivid = 3000000/wfre; if(rfdivid < 2) { rfdivid = 1; noise_con = 1; } else if(rfdivid < 3) { rfdivid = 2; noise_con = 1; } else if(rfdivid > 62) { rfdivid = 62; } else { rfdivid = ((rfdivid%2)==0)?(rfdivid):(rfdivid-1); } if(rfdivid < 3) { noise_con = 1; } else { noise_con = 0; } if(noise_con) vco02reg |= (1<<15); else vco02reg &amp;= ~(1<<15); vco02reg |= (rfdivid<<7); vco_fre = wfre*rfdivid; rfDividReg[1] = vco02reg>>8; rfDividReg[2] = vco02reg&amp;0xff; WriteAFre(vco_fre); } 吧所有注释删掉你帮我重新给每行加注释,再加上块注释
最新发布
12-19
#include "math.h" #include "afe4300_app.h" #include "spi.h" #include "stdio.h" #include "lora.h" #include "app_system.h" #if 1 int16_t KalmanFilter(int16_t inData) { static float prevData = 0; //???? static float p = 1, q = 0.001, r = 0.1, kGain = 0; // q????? r????? p = p + q; kGain = p / ( p + r ); //??????? inData = prevData + ( kGain * ( inData - prevData ) ); //????????? p = ( 1 - kGain ) * p; //?????? prevData = inData; return inData; //????? } #endif #if 0 void kalman_init(kalman_struct *kalman_lcw, float init_x, float init_p) { kalman_lcw->x = init_x;//???????,??????????(????) kalman_lcw->p = init_p;//???????????????? kalman_lcw->A = 1; kalman_lcw->H = 1; kalman_lcw->q = 10e-3;//10e-6;//2e2;////predict noise convariance ??(??)???? ???????????????? kalman_lcw->r = 5e2;//10e-5;//??(??)???????????,?????: } float kalman_filter(kalman_struct *kalman_lcw, float measure) { /* Predict */ kalman_lcw->x = kalman_lcw->A * kalman_lcw->x; kalman_lcw->p = kalman_lcw->A * kalman_lcw->A * kalman_lcw->p + kalman_lcw->q; /* p(n|n-1)=A^2*p(n-1|n-1)+q */ /* Measurement */ kalman_lcw->gain = kalman_lcw->p * kalman_lcw->H / (kalman_lcw->p * kalman_lcw->H * kalman_lcw->H + kalman_lcw->r); kalman_lcw->x = kalman_lcw->x + kalman_lcw->gain * (measure - kalman_lcw->H * kalman_lcw->x); kalman_lcw->p = (1 - kalman_lcw->gain * kalman_lcw->H) * kalman_lcw->p; return kalman_lcw->x; } #endif void resetAFE4300(void) { SPI_AFE4300_RST_LOW; tos_sleep_ms(10); SPI_AFE4300_RST_HIGH; spiWrite(MISC1_REGISTER,0x0000); spiWrite(MISC2_REGISTER,0xFFFF); spiWrite(MISC3_REGISTER,0x0030); } void initAFE4300(void) { spiWrite(ADC_CONTROL_REGISTER,0x4170); spiWrite(DEVICE_CONTROL_1,0x6004);//,0x6006 spiWrite(ISW_MATRIX,0x0000);//0x0804 spiWrite(VSW_MATRIX,0x0000);//0x0804 spiWrite(IQ_MODE_ENABLE,0x0000); spiWrite(WEIGHT_SCALE_CONTROL,0x0000); spiWrite(BCM_DAC_FREQ,0x0010);//0x0010 spiWrite(DEVICE_CONTROL_2,0x0000); spiWrite(ADC_CONTROL_REGISTER_2,0x0011);//0x0063 spiWrite(MISC1_REGISTER,0x0000); spiWrite(MISC2_REGISTER,0xFFFF); spiWrite(MISC3_REGISTER,0x0030);//0x00C0//0x0030 } void afe4300_config_test(void) { spiWrite(ADC_CONTROL_REGISTER,0x4170); //Differential measurement mode, 32 SPS //0x4120 4130: 64SPS APP_LOG("ADC_CONTROL_REGISTER : %x\n", spiRead(ADC_CONTROL_REGISTER)); spiWrite(DEVICE_CONTROL_1,0x6006); //Power up BCM signal chain APP_LOG("DEVICE_CONTROL_1 : %x\n", spiRead(DEVICE_CONTROL_1)); spiWrite(ISW_MATRIX,0x0408); //Channels IOUTP1 and IOUTN0 0x0804 APP_LOG("ISW_MATRIX : %x\n", spiRead(ISW_MATRIX)); spiWrite(VSW_MATRIX,0x0408); //Channels VSENSEP1 and VSENSEN0 APP_LOG("VSW_MATRIX : %x\n", spiRead(VSW_MATRIX)); spiWrite(ADC_CONTROL_REGISTER_2,0x0063); //ADC selects output of BCM-I output APP_LOG("ADC_CONTROL_REGISTER_2 : %x\n", spiRead(ADC_CONTROL_REGISTER_2)); spiWrite(WEIGHT_SCALE_CONTROL,0x0000); //Gain = 1 DAC Offset = 0 APP_LOG("WEIGHT_SCALE_CONTROL : %x\n", spiRead(WEIGHT_SCALE_CONTROL)); spiWrite(BCM_DAC_FREQ,0x0020);//0x0010 APP_LOG("BCM_DAC_FREQ : %x\n", spiRead(BCM_DAC_FREQ)); spiWrite(DEVICE_CONTROL_2,0x1800);//32khz APP_LOG("DEVICE_CONTROL_2 : %x\n", spiRead(DEVICE_CONTROL_2)); spiWrite(IQ_MODE_ENABLE,0x0800); APP_LOG("IQ_MODE_ENABLE : %x\n", spiRead(IQ_MODE_ENABLE)); } void afe4300_config(void) { spiWrite(ADC_CONTROL_REGISTER,0x4170); //Differential measurement mode, 32 SPS //0x4120 4130: 64SPS spiWrite(DEVICE_CONTROL_1,0x6006); //Power up BCM signal chain spiWrite(ISW_MATRIX,0x0408); //Channels IOUTP1 and IOUTN0 0x0804 spiWrite(VSW_MATRIX,0x0408); //Channels VSENSEP1 and VSENSEN0 spiWrite(ADC_CONTROL_REGISTER_2,0x0063); //ADC selects output of BCM-I output spiWrite(WEIGHT_SCALE_CONTROL,0x0000); //Gain = 1 DAC Offset = 0 spiWrite(BCM_DAC_FREQ,0x0020);//0x0010 spiWrite(DEVICE_CONTROL_2,0x1800);//32khz spiWrite(IQ_MODE_ENABLE,0x0800); APP_LOG("afe4300 initialization\n\r"); } //Supported IQ frequencies are 8,16,32,64 and 128 kHz void set_frequency(int frequency_khz, bool set_IQ_demod) { if (frequency_khz == 8) //DAC to 8 kHz { spiWrite(BCM_DAC_FREQ, 0x08); if (set_IQ_demod) spiWrite(DEVICE_CONTROL_2, 0x2800); } else if (frequency_khz == 16) { spiWrite(BCM_DAC_FREQ, 0x10); if (set_IQ_demod) spiWrite(DEVICE_CONTROL_2, 0x2000); } else if (frequency_khz == 32) { spiWrite(BCM_DAC_FREQ, 0x20); if (set_IQ_demod) spiWrite(DEVICE_CONTROL_2, 0x1800); } else if (frequency_khz == 64) { spiWrite(BCM_DAC_FREQ, 0x40); if (set_IQ_demod) spiWrite(DEVICE_CONTROL_2, 0x1000); } else if (frequency_khz == 128) { spiWrite(BCM_DAC_FREQ, 0x80); if (set_IQ_demod) spiWrite(DEVICE_CONTROL_2, 0x0800);//dfsdfds } else { if (set_IQ_demod) spiWrite(DEVICE_CONTROL_2, 0x0000); spiWrite(BCM_DAC_FREQ, frequency_khz); } } uint16_t read_last(void) { return spiRead(ADC_DATA_RESULT);//*(1.7/32768.0); } void wait_for_stability(uint16_t cnt) { uint16_t i = 0; //APP_LOG("last:\n"); do { //APP_LOG("%x\t", read_last()); i++; } while (i < cnt); //APP_LOG("\n"); } void IQ_read(uint16_t outchannel, uint16_t inchannel, int16_t *result_I, int16_t *result_Q) { const uint16_t modes[] = {0x0063, 0x0065}; volatile short datai_adc=0; int datai=0; spiWrite(IQ_MODE_ENABLE,0x0800); set_frequency(32, true); spiWrite(ISW_MATRIX, outchannel); spiWrite(VSW_MATRIX, inchannel); for (uint8_t i = 0; i < 2; i++) { spiWrite(ADC_CONTROL_REGISTER_2, modes[i]); //wait_for_stability(1000); //tos_sleep_ms(500); HAL_Delay(200); //volatile uint16_t raw_data = spiRead(ADC_DATA_RESULT); datai=0; for(uint8_t k=0;k<20;k++) { datai_adc = spiRead(0x00); datai += datai_adc; } datai /= 20; if (i == 0) { *result_I = (int16_t)datai; // I分量 } else { *result_Q = (int16_t)datai; // Q分量 } } //spiWrite(0x01,0x4180); //spiWrite(0x09,0x600C); } void FWR_read(uint16_t outchannel, uint16_t inchannel, int16_t *result_I, uint8_t frequency, uint16_t delay) { set_frequency(frequency, false); spiWrite(IQ_MODE_ENABLE, 0x00); //Select FWR Mode spiWrite(ADC_CONTROL_REGISTER_2, 0x63); //ADCREF to VREF / ADC connected to BCM spiWrite(ISW_MATRIX, inchannel); //Select VSENSE RN1-RP0 spiWrite(VSW_MATRIX, outchannel); //Select IOUT RN1-RP0 //wait_for_stability(10, 10, quiet); tos_sleep_ms(delay); *result_I = spiRead(ADC_DATA_RESULT);//*(1.7/32768.0); } const uint16_t ch_cal[] = {0x0201,0x0202,0x0101,0x0102};//RP1RN0,RP1RN1,RP0RN0,RP0RN1 //const uint16_t isw_mux_reg[] = {OUTPUT_DIFF_CHANNEL_13, OUTPUT_DIFF_CHANNEL_13, OUTPUT_DIFF_CHANNEL_10, OUTPUT_DIFF_CHANNEL_40, OUTPUT_DIFF_CHANNEL_15, OUTPUT_DIFF_CHANNEL_45, OUTPUT_DIFF_CHANNEL_05, OUTPUT_DIFF_CHANNEL_24}; //const uint16_t vsense_mux_reg[] = {INPUT_DIFF_CHANNEL_24, INPUT_DIFF_CHANNEL_13, INPUT_DIFF_CHANNEL_10, INPUT_DIFF_CHANNEL_40, INPUT_DIFF_CHANNEL_15, INPUT_DIFF_CHANNEL_45, INPUT_DIFF_CHANNEL_05, INPUT_DIFF_CHANNEL_24 }; const uint16_t isw_mux_reg[] = {OUTPUT_DIFF_CHANNEL_01, OUTPUT_DIFF_CHANNEL_23, OUTPUT_DIFF_CHANNEL_45, OUTPUT_DIFF_CHANNEL_40, OUTPUT_DIFF_CHANNEL_15, OUTPUT_DIFF_CHANNEL_45, OUTPUT_DIFF_CHANNEL_05, OUTPUT_DIFF_CHANNEL_24}; const uint16_t vsense_mux_reg[] = {INPUT_DIFF_CHANNEL_01, INPUT_DIFF_CHANNEL_23, INPUT_DIFF_CHANNEL_45, INPUT_DIFF_CHANNEL_40, INPUT_DIFF_CHANNEL_15, INPUT_DIFF_CHANNEL_45, INPUT_DIFF_CHANNEL_05, INPUT_DIFF_CHANNEL_24 }; uint8_t testbuff[12*4]; void bcm_ref_iq(void) { uint8_t i,j=0; volatile short datai_adc; volatile short dataq_adc; volatile short datai_adc1; volatile short dataq_adc1; int datai = 0; int dataq = 0; uint8_t k=0; { spiWrite(IQ_MODE_ENABLE,0x0800); set_frequency(32, true); spiWrite(0x0A,ch_cal[i]); //OUTPUT spiWrite(0x0B,ch_cal[i]); //INPUT spiWrite(0x10,0x0063); //ADC_FOR_BCM_CHANNELI HAL_Delay(200); spiRead(0x00); } for(i=0;i<4;i++) { spiWrite(0x0A,ch_cal[i]); //OUTPUT spiWrite(0x0B,ch_cal[i]); //INPUT spiWrite(0x10,0x0063); //ADC_FOR_BCM_CHANNELI HAL_Delay(200); //datai_adc = spiRead(0x00); datai=0; for(uint8_t k=0;k<20;k++) { datai_adc1 = spiRead(0x00); datai += datai_adc1; } datai_adc = datai / 20; spiWrite(0x10,0x0065); //ADC_FOR_BCM_CHANNELQ HAL_Delay(200); //dataq_adc = spiRead(0x00); dataq=0; for(uint8_t k=0;k<20;k++) { dataq_adc1 = spiRead(0x00); dataq += dataq_adc1; } dataq_adc = dataq / 20; testbuff[j++] = datai_adc >> 8; testbuff[j++] = datai_adc &amp; 0xff; testbuff[j++] = dataq_adc >> 8; testbuff[j++] = dataq_adc &amp; 0xff; } } void bcm_measurement_iq(void) { //resetAFE4300(); //afe4300_config(); int16_t result_I, result_Q; uint8_t j=16; bcm_ref_iq(); for (uint8_t i=0; i<sizeof(isw_mux_reg)/sizeof(isw_mux_reg[0]); i++) { result_I = 0; result_Q = 0; IQ_read(isw_mux_reg[i], vsense_mux_reg[i], &amp;result_I, &amp;result_Q); testbuff[j++] = result_I >> 8; testbuff[j++] = result_I &amp; 0xff; testbuff[j++] = result_Q >> 8; testbuff[j++] = result_Q &amp; 0xff; } } void zref_calc(uint8_t* rawdata, float* caldata) { uint8_t i,j; static const float realy[4]={99.1,196.4,699.1,950.2};//{99,195,696,947};//{99.1,196.4,699.1,950.2};//{98.7,196.6,698.1,949.2};//x[4]={29,55,188,255}; float datai, dataq, theta_tmp[12], z_tmp[12]; float lxx, lxy, sum_x, sum_y, avg_x, avg_y, avg_theta; float aref, bref, theta; lxx = lxy = sum_x = sum_y = avg_theta = aref = bref = theta = 0.0; for (i=0, j=0; i < 48; i=i+4, j++) { datai = (float)((rawdata[i] << 8) + rawdata[i + 1])* 0.0518799; dataq = (float)((rawdata[i + 2] << 8) + rawdata[i + 3])* 0.0518799; //APP_LOG("#####cal: datai =%.2f, dataq =%.2f\n",datai,dataq); theta_tmp[j] = 57.2957795f * atan2f(dataq, datai); // 使用atan2避免除零错误 z_tmp[j] = sqrtf(datai * datai + dataq * dataq); //* (1.7f / 32768.0f); //APP_LOG("#####cal: ampli[%d] =%.2f, theta[%d] =%.2f\n", j,z_tmp[j],j, theta_tmp[j]); } for (i = 0; i < 4; i++) { sum_x += z_tmp[i]; sum_y += realy[i]; avg_theta += theta_tmp[i]; } avg_x = sum_x / 4.0; avg_y = sum_y / 4.0; theta = avg_theta / 4.0; for (i = 0; i != 4; i++) { lxx += (z_tmp[i] - avg_x) * (z_tmp[i] - avg_x); lxy += (z_tmp[i] - avg_x) * (realy[i] - avg_y); } bref = lxy / lxx; aref = avg_y - bref * avg_x; APP_LOG("#####cal: Y=%.2fx + %.2f, theta avg =%.2f\n", bref, aref, theta); for (i=4,j=0; i < 12; i++, j=j+2) { caldata[j] = z_tmp[i] * bref + aref; caldata[j+1] = theta_tmp[i] - theta; } } void bcm_calc_iq(void) { float caldata[16]; zref_calc(testbuff, caldata); for (uint8_t i = 0; i < 16; i=i+2) { APP_LOG("#####cal: test amp = %.2f, theta avg =%.2f\n", caldata[i], caldata[i+1]); } } //const uint16_t ch_cal[4] = {0x0201,0x0202,0x0101,0x0102};//RP1RN0,RP1RN1,RP0RN0,RP0RN1 volatile float x[4]={0,0,0,0};//{29,55,188,255}; volatile float angle[4]={0,0,0,0}; static const float y[4]={99.1,196.4,699.1,950.2}; static float aref = 0,bref = 0,theta = 0; void zref_calc1(void) { // int n = sizeof(x) / sizeof(x[0]); int i; float lxx, lxy, sum_x, sum_y, avg_x, avg_y; aref = bref = lxx = lxy = sum_x = sum_y = 0.0; for (i = 0; i < 4; i++) { sum_x += x[i]; sum_y += y[i]; } avg_x = sum_x / 4.0; avg_y = sum_y / 4.0; for (i = 0; i != 4; i++) { lxx += (x[i] - avg_x)*(x[i] - avg_x); lxy += (x[i] - avg_x)*(y[i] - avg_y); } bref = lxy / lxx; aref = avg_y - bref*avg_x; APP_LOG("cal: Y=%.2fx + %.2f\n",bref,aref); } void thetaref_calc(void) { float tmp = 0; for (int i = 0; i < 4; i++) { tmp += angle[i]; } theta = tmp / 4.0; APP_LOG("#####cal: theta avg =%.2f\n",theta); } void bcm_config_measurement_ref_iq(void) { uint8_t i; short datai_adc; short dataq_adc; float datai = 0; float dataq = 0; for(i=0;i<4;i++) { angle[i] = 0; x[i] = 0; } for(i=0;i<4;i++) { spiWrite(0x0A,ch_cal[i]); //OUTPUT spiWrite(0x0B,ch_cal[i]); //INPUT spiWrite(0x10,0x0063); //ADC_FOR_BCM_CHANNELI HAL_Delay(200); datai_adc = spiRead(0x00); datai = datai_adc * 0.051889; spiWrite(0x10,0x0065); //ADC_FOR_BCM_CHANNELQ HAL_Delay(200); dataq_adc = spiRead(0x00); dataq = dataq_adc * 0.051889; angle[i] = 57.3 * atan(dataq / datai); x[i] = sqrt(datai * datai + dataq * dataq); } for(i=0;i<4;i++) APP_LOG("iq reference: root=%.2f angle=%.2f\n",x[i], angle[i]); zref_calc1(); thetaref_calc(); } 可是我用STM32WL052测得的数据就很正常啊 #####cal: Y=1.47x + -8.10, theta avg =26.07 #####cal: test amp = 88.08, theta avg =0.93 #####cal: test amp = 188.53, theta avg =-0.32
07-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值