STM32调试MIPI RFFE协议
目录
一、前言
二、RFFE总线
三、协议时序
四、器件状态
五、更改USID
六、程序代码
七、参考资料
一、前言
前阵子手里有几个天线调谐器芯片,1.5x1mm的BGA封装非常小,通信控制协议是MIPI RFFE协议,这个协议网上资料比较少,搜了一下搜到了一个标准的MIPI协议文档,里面各种控制时序和介绍都写的非常详细了,其实就和I2C这类的协议差不多吧,然后在CSDN上又找到了一个STM32用GPIO模拟MIPI RFFE协议的文档资料作参考,稍微改了改,调试的时候遇到了一些问题,然后用逻辑分析仪抓了抓波形改了改代码,然后调试成功了,本文进行调试总结。
二、RFFE总线
RFFE总线定义如下:
VIO:RFFE接口的基准电压,也可以作为复位和使能输入。一个施加到VIO 信号的逻辑低电平可以将RFFE接口关断。
SCLK:RFFE 总线时钟输入。通常被连接至RF 或基带IC 上的RFFE 主机。当未施加VIO 时,SCLK 必须为低电平。时钟频率范围为32KHz到26MHz。
SDATA:RFFE 总线数据输入/输出。通常被连接至RF 或基带IC 上的RFFE 主机。当未施加VIO 时,SCLK 必须为低电平。
MIPI RFFE协议和I2C协议真的共性很多,都是一条数据线(SDATA)和一条时钟线(SCLK),然后所有的从设备都通过这两条线挂接到总线上,所有的从设备都可以设置独立的从设备地址,Master可以通过从设备地址来单独控制多个从设备中的单个设备,RFFE总线高电平为1.2到1.8V,VIO供电也是1.2到1.8V,注意不要用3.3V单片机IO直接驱动,要接个电平转换芯片。RFFE设备连接框图如下:
三、协议时序
时序操作基本上可以归为两类操作,寄存器写和寄存器读,其中寄存器写又分为寄存器0写入、普通寄存器写入和扩展寄存器写入;读可以分为普通寄存器读和扩展寄存器读。从机寄存器寻址如下。
写寄存器命令分好几种,区别就是可以访问的寄存器地址区间不一样,我手头上这个IC的有用数据都是定义在寄存器0到31上的,之后的地址没定义,所以用不到扩展寄存器写命令。不管是哪种操作,都可以归类为:SSC头+命令帧+数据帧+停止帧。
1、基本命令帧
(1)SSC(Sequence Start Condition)
SSC具体时序是SCLK为低电平时,SDATA由0变为两个周期的1,然后变为0。SSC相当于是启动信号,每次命令操作都需要先发送该时序。
(2)命令帧
命令帧前4bit为从机地址,接下来是8bit的命令+1bit的奇校验位(对前12bit数据进行奇校验),
(3)数据帧
8bit的数据+1bit的奇校验。
(4)Bus Park帧
最后在SCLK的一个下降沿SDATA保持一个以上周期的0电平来使总线挂起也就是Bus park。
2、寄存器写操作
(1)寄存器0写入
SA0到SA3是从机地址,一般和器件的4位USID值是一致的,寄存器0写入命令的命令帧前8bit的最高位D7是固定为1的,剩下的D0到D6是写入到寄存器0的数据,实际上也就只能修改寄存器0的D0到D6的数据。
(2)非0寄存器写入
命令帧的前3位D7,D6,D5固定为0,1,0,剩下的5位表示寄存器地址,实际上能够寻址的寄存器范围只有0到31,命令帧接下来是数据帧,D0到D7是要写入到相应寄存器的数据。
(3)扩展寄存器写入
命令帧的前4位固定为全0,只剩下BC0~BC3是可以自己填的,这4位表示要写入多少个字节的数据,0表示写一个字节,0xF表示写16个字节,其实一个寄存器只能写1个字节,多写的字节会根据当前寄存器的地址开始向后写入到后面的寄存器中。数据帧那里的8位用来填写寄存器的地址,之后的很多个帧根据BC0~BC3的值追加多个要写入的字节数据。
3、寄存器读操作
(1)寄存器读
读寄存器跟写寄存器一样的套路,先给4位从机地址,然后因为是普通读,命令帧的高三位定死了是0,1,1,剩下的5位可以自己填,实际只能寻址0到31这些寄存器,然后后面接8位的数据读取操作,这里读取操作的时候主机要把SDATA设为下拉模式,即默认电平为低电平,然后从机输出数据的话如果是1会把SDATA拉高,8位寄存器数据之后是1位寄校验(对前面8位数据校验),注意编程的时候还是要判断下器件给的奇校验位P,看下是不是校验能够通过,否则读到的数据是错的。
(2)扩展寄存器读
BC0到BC3表示读取的字节数目,为0时表示都1个字节,为0xF时表示读16个字节,读超过1个字节会返回当前寄存器地址往后的寄存器地址的内容,和扩展寄存器写套路一样的。
四、器件状态
以下是器件状态切换图:
RFFE的器件有几种状态可以切换,分别为STARTUP、ACTIVE、LOW POWER、SHUTDOWN。通过VIO电平状态切换和往PWR_MODE寄存器写值来跳转这些状态。操作IC的时候发现不激活IC的状态只能读寄存器,写寄存器时无效。
五、更改USID
单独更改USID寄存器的值是改不了USID的,发现读回来的数据还是原来的。改USID要同时更改PRODUCT_ID、MANUFACTURER_ID和USID,这样才能改动USID的值,然后从机地址就跟着一起变了,下次给SA0~SA3的时候记得要替换回新的从机地址。具体时序如下:
看着那么长一段,其实就是三个寄存器写命令拼在一起。
六、程序代码
代码是基于STM32F103XX调试的,如下:
MIPI.h
#ifndef _MIPI_H_
#define _MIPI_H_#include "stm32f10x.h"
#include "public.h"
#include "systick.h"#define REG_PAC_SPST_STATE 0x00
#define REG_VBODY_TIMERS 0x01
#define REG_VVAR 0x02
#define REG_CUSTOMER_SRATCH 0x17
#define REG_RFFE_STATUS 0x1A
#define REG_GROUP_SID 0x1B
#define REG_PM_TRIG 0x1C
#define REG_PRODUCT_ID 0x1D
#define REG_MANUFACTURER_ID 0x1E
#define REG_MAN_USID 0x1F
#define REG_CMOS_VERSION_ID 0x21
#define REG_SDATA_DRV_LVL 0x2B#define CHECK_OK 1
#define CHECK_FAIL 0#define RFFE_SDATA_PORT GPIOA
#define RFFE_SDATA_PIN GPIO_Pin_0#define RFFE_SCLK_PORT GPIOA
#define RFFE_SCLK_PIN GPIO_Pin_1#define RFFE_SDATA_HIGH GPIO_SetBits(RFFE_SDATA_PORT, RFFE_SDATA_PIN)
#define RFFE_SDATA_LOW GPIO_ResetBits(RFFE_SDATA_PORT, RFFE_SDATA_PIN)#define RFFE_SDATA_READ GPIO_ReadInputDataBit(RFFE_SDATA_PORT, RFFE_SDATA_PIN)#define RFFE_SCLK_HIGH GPIO_SetBits(RFFE_SCLK_PORT, RFFE_SCLK_PIN)
#define RFFE_SCLK_LOW GPIO_ResetBits(RFFE_SCLK_PORT, RFFE_SCLK_PIN)#define Delay_nop(x) delay_us(x);//#define Delay_nop(x) {;;;;;};#define Bus_Park() RFFE_SDATA_LOW//GPIO初始化
extern void RFFE_Init(void);
//寄存器读
extern unsigned char Register_Read(unsigned char USID_Address, unsigned char Reg_address, unsigned char *Reg_Value);
//0寄存器写
extern void Register_0_Write(unsigned char USID_Address, unsigned char Reg_data);
//非0寄存器写,实验中发现写0寄存器也生效
extern void Register_Write(unsigned char USID_Address, unsigned char Reg_Address, unsigned char Reg_data);
//器件使能
extern void Active_Product(unsigned char USID_Address);
//必须连续一起修改Product_ID、MANUFACTURER_ID、USID才能使新的USID生效,单独修改USID寄存器不生效
extern void Register_Write_USID(unsigned char Old_USID_Address, unsigned char Product_ID, unsigned short MANUFACTURER_ID, unsigned char MAN_USID);
//写一个字节到扩展寄存器,扩展寄存器指地址大于0x1F的寄存器
extern void Extended_Register_Write(unsigned char USID_Address, unsigned char Reg_Address, unsigned char Reg_data);
//扩展寄存器读一个字节
extern unsigned char Extended_Register_Read(unsigned char USID_Address, unsigned char Reg_address, unsigned char *Reg_Value);#endif
MIPI.c
#include "MIPI.h"void RFFE_SDATA_Output_Mode(void)
{GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = RFFE_SDATA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(RFFE_SDATA_PORT, &GPIO_InitStructure); RFFE_SDATA_LOW;
}void RFFE_SDATA_Input_Mode(void)
{GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = RFFE_SDATA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(RFFE_SDATA_PORT, &GPIO_InitStructure); //RFFE_SDATA_LOW;
}void RFFE_SCLK_Output_Mode(void)
{GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = RFFE_SCLK_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(RFFE_SCLK_PORT, &GPIO_InitStructure); RFFE_SCLK_LOW;
}void RFFE_Init(void)
{RFFE_SCLK_Output_Mode();RFFE_SDATA_Output_Mode();}void SSC_Head(void)
{RFFE_SCLK_LOW;RFFE_SDATA_LOW;Delay_nop(10);RFFE_SDATA_HIGH;Delay_nop(1);Delay_nop(1);Delay_nop(1);RFFE_SDATA_LOW;Delay_nop(1);
}// void Bus_Park()
// {
// RFFE_SDATA_LOW;
// // Delay_nop(1);
// // RFFE_SCLK_HIGH;
// }void Register_0_Write(unsigned char USID_Address, unsigned char Reg_data)
{int i;unsigned char P_Bit = 1;unsigned char Reg_frame_13bit[13];//前四位为USID地址for(i = 0; i < 4; i++){if(USID_Address & 0x80){Reg_frame_13bit[i] = 1;}else{Reg_frame_13bit[i] = 0;}USID_Address = USID_Address << 1;}//八位数据位,首位1为寄存器0写入标志位Reg_data = Reg_data | 0x80; //加入1000b的0寄存器写入标志位for(i = 0; i < 8; i++){if(Reg_data & 0x80){Reg_frame_13bit[i + 4] = 1;}else{Reg_frame_13bit[i + 4] = 0;}Reg_data = Reg_data << 1;}//前12位进行奇校验P_Bit = 1;for(i = 0; i < 12; i++){if(Reg_frame_13bit[i]){P_Bit ^= 0x01;}}Reg_frame_13bit[12] = P_Bit;//开始发送总线时序RFFE_SDATA_Output_Mode();//SSC_HeadSSC_Head();RFFE_SCLK_HIGH;//data frame写入for(i = 0; i < 13; i++){if(Reg_frame_13bit[i]){RFFE_SDATA_HIGH;}else{RFFE_SDATA_LOW;}Delay_nop(1);RFFE_SCLK_HIGH;Delay_nop(1);RFFE_SCLK_LOW;//Delay_nop(1);//RFFE_SCLK_HIGH;}//bus parkBus_Park();Delay_nop(1);RFFE_SCLK_HIGH;Delay_nop(1);RFFE_SCLK_LOW;
}void Register_Write(unsigned char USID_Address, unsigned char Reg_Address, unsigned char Reg_data)
{int i;unsigned char P_Bit = 1;unsigned char Reg_frame_13bit[13];unsigned char Reg_data_frame_9Bit[9];//前四位为USID地址for(i = 0; i < 4; i++){if(USID_Address & 0x80){Reg_frame_13bit[i] = 1;}else{Reg_frame_13bit[i] = 0;}USID_Address = USID_Address << 1;}//八位数据位,首位1为寄存器0写入标志位Reg_Address &= ~((unsigned char)7 << 5);Reg_Address = Reg_Address | 0x40; //加入010b的0寄存器写入标志位for(i = 0; i < 8; i++){if(Reg_Address & 0x80){Reg_frame_13bit[i + 4] = 1;}else{Reg_frame_13bit[i + 4] = 0;}Reg_Address = Reg_Address << 1;}//前12位进行奇校验P_Bit = 1;for(i = 0; i < 12; i++){if(Reg_frame_13bit[i]){P_Bit ^= 0x01;}}Reg_frame_13bit[12] = P_Bit;//处理写入寄存器的数据for(i = 0; i < 8; i++){if(Reg_data & 0x80){Reg_data_frame_9Bit[i] = 1;}else{Reg_data_frame_9Bit[i] = 0;}Reg_data = Reg_data << 1;}//前8位进行奇校验P_Bit = 1;for(i = 0; i < 8; i++){if(Reg_data_frame_9Bit[i]){P_Bit ^= 0x01;}}Reg_data_frame_9Bit[8] = P_Bit;//开始发送总线时序RFFE_SDATA_Output_Mode();//SSC_HeadSSC_Head();//Reg frame写入for(i = 0; i < 13; i++){if(Reg_frame_13bit[i]){RFFE_SDATA_HIGH;}else{RFFE_SDATA_LOW;}Delay_nop(1);RFFE_SCLK_HIGH;Delay_nop(1);RFFE_SCLK_LOW;//Delay_nop(1);}//data frame写入for(i = 0; i < 9; i++){if(Reg_data_frame_9Bit[i]){RFFE_SDATA_HIGH;}else{RFFE_SDATA_LOW;}Delay_nop(1);RFFE_SCLK_HIGH;Delay_nop(1);RFFE_SCLK_LOW;//Delay_nop(1);}//bus parkBus_Park();Delay_nop(1);RFFE_SCLK_HIGH;Delay_nop(1);RFFE_SCLK_LOW;
}unsigned char Register_Read(unsigned char USID_Address, unsigned char Reg_address, unsigned char *Reg_Value)
{int i = 0;unsigned char P_Bit = 1;unsigned char Reg_frame_13bit[13];unsigned char Receive_Bit9_frame[9];//实验发现需要先拉高SDATA和SCLK才能读正确RFFE_SDATA_Output_Mode();RFFE_SCLK_HIGH;RFFE_SDATA_HIGH;Delay_nop(10);RFFE_SCLK_LOW;Delay_nop(1);RFFE_SDATA_LOW;Delay_nop(10);//前四位为USID地址for(i = 0; i < 4; i++){if(USID_Address & 0x80){Reg_frame_13bit[i] = 1;}else{Reg_frame_13bit[i] = 0;}USID_Address = USID_Address << 1;}//八位寄存器地址转换Reg_address = Reg_address | 0x60; //加入0110b读取指令标志位for(i = 4; i < 12; i++){if(Reg_address & 0x80){Reg_frame_13bit[i] = 1;}else{Reg_frame_13bit[i] = 0;}Reg_address = Reg_address << 1;}//前12位进行奇校验PP_Bit = 1;for(i = 0; i < 12; i++){if(Reg_frame_13bit[i]){P_Bit ^= 0x01;}}Reg_frame_13bit[12] = P_Bit;//开始发送总线时序RFFE_SDATA_Output_Mode();//SSC_HeadSSC_Head();//data frame写入for(i = 0; i < 13; i++){if(Reg_frame_13bit[i]){RFFE_SDATA_HIGH;}else{RFFE_SDATA_LOW;}Delay_nop(1);RFFE_SCLK_HIGH;Delay_nop(1);RFFE_SCLK_LOW;//Delay_nop(1);}//bus parkBus_Park();Delay_nop(1);RFFE_SCLK_HIGH;Delay_nop(1);RFFE_SCLK_LOW;RFFE_SDATA_Input_Mode();//read data数据读出,同时对数据进行奇校验P_Bit = 1;for(i = 0; i < 9; i++){Delay_nop(2);RFFE_SCLK_HIGH;Delay_nop(2);RFFE_SCLK_LOW;if(RFFE_SDATA_READ){Receive_Bit9_frame[i] = 1;P_Bit ^= 0x01;}else{Receive_Bit9_frame[i] = 0;}}*Reg_Value = 0;for(i = 0; i < 8; i++){*Reg_Value <<= 1;*Reg_Value |= Receive_Bit9_frame[i] ? 1 : 0;}//bus parkRFFE_SDATA_Output_Mode();Bus_Park();Delay_nop(2);RFFE_SCLK_HIGH;Delay_nop(2);RFFE_SCLK_LOW;if(P_Bit){//奇校验失败return CHECK_FAIL;}else{//奇校验成功return CHECK_OK;}
}//器件使能
void Active_Product(unsigned char USID_Address)
{Register_Write(USID_Address, 0x1C, 0x38);Register_Write(USID_Address, 0x02, 0x02);
}//必须连续一起修改Product_ID、MANUFACTURER_ID、USID才能使新的USID生效,单独修改USID寄存器不生效
void Register_Write_USID(unsigned char Old_USID_Address, unsigned char Product_ID, unsigned short MANUFACTURER_ID, unsigned char MAN_USID)
{Register_Write(Old_USID_Address, 0x1D, Product_ID);Register_Write(Old_USID_Address, 0x1E, MANUFACTURER_ID);Register_Write(Old_USID_Address, 0x1F, MAN_USID);
}//写一个字节到扩展寄存器,扩展寄存器指地址大于0x1F的寄存器
void Extended_Register_Write(unsigned char USID_Address, unsigned char Reg_Address, unsigned char Reg_data)
{int i;unsigned char P_Bit = 1;unsigned char Byte_len = 0; //0代表写一个字节unsigned char Reg_frame_22bit[22];unsigned char Reg_data_frame_9Bit[9];//前四位为USID地址for(i = 0; i < 4; i++){if(USID_Address & 0x80){Reg_frame_22bit[i] = 1;}else{Reg_frame_22bit[i] = 0;}USID_Address = USID_Address << 1;}//默认写一个字节,可以改成写多个字节,多个字节会顺推写到后面的寄存器地址,最多连续写16个字节Byte_len &= 0x0F;Byte_len = Byte_len | 0x00; for(i = 0; i < 8; i++){if(Byte_len & 0x80){Reg_frame_22bit[i + 4] = 1;}else{Reg_frame_22bit[i + 4] = 0;}Byte_len = Byte_len << 1;}//前12位进行奇校验P_Bit = 1;for(i = 0; i < 12; i++){if(Reg_frame_22bit[i]){P_Bit ^= 0x01;}}Reg_frame_22bit[12] = P_Bit;//八位寄存器地址for(i = 0; i < 8; i++){if(Reg_Address & 0x80){Reg_frame_22bit[i + 13] = 1;}else{Reg_frame_22bit[i + 13] = 0;}Reg_Address = Reg_Address << 1;}//第13 ~ 20位进行奇校验P_Bit = 1;for(i = 0; i < 8; i++){if(Reg_frame_22bit[i + 13]){P_Bit ^= 0x01;}}Reg_frame_22bit[21] = P_Bit;//处理写入寄存器的数据for(i = 0; i < 8; i++){if(Reg_data & 0x80){Reg_data_frame_9Bit[i] = 1;}else{Reg_data_frame_9Bit[i] = 0;}Reg_data = Reg_data << 1;}//前8位进行奇校验P_Bit = 1;for(i = 0; i < 8; i++){if(Reg_data_frame_9Bit[i]){P_Bit ^= 0x01;}}Reg_data_frame_9Bit[8] = P_Bit;//开始发送总线时序RFFE_SDATA_Output_Mode();//SSC_HeadSSC_Head();//Reg frame写入for(i = 0; i < 22; i++){if(Reg_frame_22bit[i]){RFFE_SDATA_HIGH;}else{RFFE_SDATA_LOW;}Delay_nop(1);RFFE_SCLK_HIGH;Delay_nop(1);RFFE_SCLK_LOW;//Delay_nop(1);}//data frame写入for(i = 0; i < 9; i++){if(Reg_data_frame_9Bit[i]){RFFE_SDATA_HIGH;}else{RFFE_SDATA_LOW;}Delay_nop(1);RFFE_SCLK_HIGH;Delay_nop(1);RFFE_SCLK_LOW;//Delay_nop(1);}//bus parkBus_Park();Delay_nop(1);RFFE_SCLK_HIGH;Delay_nop(1);RFFE_SCLK_LOW;
}//扩展寄存器读一个字节
unsigned char Extended_Register_Read(unsigned char USID_Address, unsigned char Reg_address, unsigned char *Reg_Value)
{int i = 0;unsigned char P_Bit = 1;unsigned char Byte_Len = 0; //读一个字节unsigned char Reg_frame_22bit[22];unsigned char Receive_Bit9_frame[9];//实验发现需要先拉高SDATA和SCLK才能读正确RFFE_SDATA_Output_Mode();RFFE_SCLK_HIGH;RFFE_SDATA_HIGH;Delay_nop(10);RFFE_SCLK_LOW;Delay_nop(1);RFFE_SDATA_LOW;Delay_nop(10);//前四位为USID地址for(i = 0; i < 4; i++){if(USID_Address & 0x80){Reg_frame_22bit[i] = 1;}else{Reg_frame_22bit[i] = 0;}USID_Address = USID_Address << 1;}//字节数目Byte_Len &= 0x0F;Byte_Len = Byte_Len | 0x20; for(i = 4; i < 12; i++){if(Byte_Len & 0x80){Reg_frame_22bit[i] = 1;}else{Reg_frame_22bit[i] = 0;}Byte_Len = Byte_Len << 1;}//前12位进行奇校验PP_Bit = 1;for(i = 0; i < 12; i++){if(Reg_frame_22bit[i]){P_Bit ^= 0x01;}}Reg_frame_22bit[12] = P_Bit;//八位寄存器地址转换for(i = 13; i < 21; i++){if(Reg_address & 0x80){Reg_frame_22bit[i] = 1;}else{Reg_frame_22bit[i] = 0;}Reg_address = Reg_address << 1;}//进行奇校验PP_Bit = 1;for(i = 13; i < 21; i++){if(Reg_frame_22bit[i]){P_Bit ^= 0x01;}}Reg_frame_22bit[21] = P_Bit;//开始发送总线时序RFFE_SDATA_Output_Mode();//SSC_HeadSSC_Head();//data frame写入for(i = 0; i < 22; i++){if(Reg_frame_22bit[i]){RFFE_SDATA_HIGH;}else{RFFE_SDATA_LOW;}Delay_nop(1);RFFE_SCLK_HIGH;Delay_nop(1);RFFE_SCLK_LOW;//Delay_nop(1);}//bus parkBus_Park();Delay_nop(1);RFFE_SCLK_HIGH;Delay_nop(1);RFFE_SCLK_LOW;RFFE_SDATA_Input_Mode();//read data数据读出,同时对数据进行奇校验P_Bit = 1;for(i = 0; i < 9; i++){Delay_nop(2);RFFE_SCLK_HIGH;Delay_nop(2);RFFE_SCLK_LOW;if(RFFE_SDATA_READ){Receive_Bit9_frame[i] = 1;P_Bit ^= 0x01;}else{Receive_Bit9_frame[i] = 0;}}*Reg_Value = 0;for(i = 0; i < 8; i++){*Reg_Value <<= 1;*Reg_Value |= Receive_Bit9_frame[i] ? 1 : 0;}//bus parkRFFE_SDATA_Output_Mode();Bus_Park();Delay_nop(2);RFFE_SCLK_HIGH;Delay_nop(2);RFFE_SCLK_LOW;if(P_Bit){//奇校验失败return CHECK_FAIL;}else{//奇校验成功return CHECK_OK;}
}
七、参考资料
《MIPI RFFE协议文档V1.10》链接:https://pan.baidu.com/s/1mnxA9TehKzA8tdSM7bdcOg 提取码:xdk3
STM32调试MIPI RFFE协议相关推荐
- MIPI RFFE协议使用不完全指南(附上代码详解和参考资料)第一部分
背景 MIPI RFFE协议 被控器件资料 程序实现 参考资料 背景 前段时间教研室需要制作一个拥有自动增益控制功能的放大器组,选来选去找到了一款英飞凌的放大器模块,该模块情况在第三部分详细介绍(具有 ...
- 野火多功能调试助手】-摄像头调试助手通讯协议
野火多功能调试助手] [复制链接] 摄像头调试助手通讯协议 LONG_R3acc 电梯直达 1# 发表于 2020-6-8 14:49:48 | 只看该作者 ] 本帖最后由 LONG_R3 ...
- STM32移植modbus通讯协议简明教程
目录 一.本文讨论内容 二.工具与源码 三.Modbus概述 四.Modbus-RTU通讯协议 五.完成Modbus输入输出代码 六.完成Modbus逻辑功能 七.测试与验证 一.本文讨论内容 本文简 ...
- 借WS2812 PWM DMA驱动调试浅谈STM32调试思路
借WS2812 PWM DMA驱动调试浅谈STM32调试思路 接触STM32差不多有4年了,在学校参加比赛时也需要进行各种调试工作,团队的配合也需要个人具有领域内快速定位与解决BUG的能力,前些日 ...
- STM32调试出现Cannot access Memory的情况
在使用STM32调试一个模块的时候,我在初始化完成之后,发现程序一直停留在某一个地方,无法进入while主循环中,每一次运行这一个函数,都会出现这种问题.这个函数核心部分是这样的 void atk_8 ...
- STM32调试过程中出现的问题1:
STM32调试过程中出现的问题1: -\HARDWARE\KEY\key.c(47): error: #29: expected an expression if(key_up&&(K ...
- MIPI RFFE扫盲(1)
MIPI RFFE MIPI RFFE MIPI RFFE是一种专门针对当前及未来无线系统在射频(RF)前端控制界面规范.随着手机射频系统日趋复杂,业界需要一个单一控制界面解决方案. MIPI联盟的R ...
- JESD204接口调试总结——JESD204C协议的介绍
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 JESD204接口调试总结--JESD204C协议的介绍 前言 JESD204C变化总结 新术语 传输层 数据链路层 物理层 第二部分 ...
- STM32 CUbeIDE 使用Ymodem协议进行串口IAP升级
STM32 CUbeIDE 使用Ymodem协议进行串口IAP升级 1.Ymodem协议简介 2.Boodload程序 2.1 传输32K限制解决 3.APP程序 4.升级测试 5.工程文件下载 ...
- STM32模拟ISO7816智能卡协议笔记
本人在同STM32芯片模拟ISO7816协议的时候,在释放触点的函数中发现其中一个被配制成复用开漏的IO管脚怎么都无法拉低.其代码如下: //释放智能卡触脚 void PSAM_DeInit(){ / ...
最新文章
- 1-2 小程序适合做什么样的应用
- 【CyberSecurityLearning 34】Linux脚本编写(Shell脚本)
- java中map转为json数据_Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回...
- C++中include 与 include 的区别
- Web API 处理机制剖析 --- 拨开迷雾看本质
- mentohust找不到服务器,mentohust最新版
- 基于SSD1306的OLED的驱动学习(二):SSD1306的寻址方式
- 电池SOC仿真系列-基于卡尔曼滤波算法的电池参数辨识
- 【SDK编程】LRC歌词制作工具V1.0
- 第六周作业--需求建模
- 2小时学会CSS,完成网页制作!
- 新型病毒DoubleAgent曝光:攻击计算机前先入侵防病毒软件
- 国内第一创作平台大佬,教你如何写好一篇技术博客?
- RNN初探(vanilla RNN)
- 小白初学Python(1) - 输入和输出
- VScode配置LaTeX
- 长江商学院入学考试逻辑题 :
- 四川师范大学雷怡教授团队揭示伴侣声音促进个体的安全学习
- python麦克风监听_python实时监听麦克风
- 数据生产要素背后的“芯”通用算力是什么?
热门文章
- 关于a标签下载文件变打开的解决方案
- 使用 stress 命令对cpu进行压力测试
- docker安装centos7镜像
- 【光学】基于Matlab模拟衍射光栅实验
- hashmap自定义排序java,如何在Java中对HashMap进行排序
- java职业教育考试题_云课堂智慧职教java职业证书题库答案
- 爬取飞猪IP免费代理练习
- 直流电机双闭环调速系统matlab,双闭环直流调速系统的课程设计(MATLAB仿真).pdf
- matlab 图像分割-自定义函数T_SGM
- java qq音乐接口 api,QQ音乐API分析(示例代码)