STM32F1 TCA9548A 驱动多个IIC器件

2023-05-16

TCA9548A的用途就是IIC扩展,每个TCA9548A可以扩展出8路IIC。TCA9548A芯片带有地址选择引脚A0/A1/A2,根据高低电平不同,从MCU的一路IIC最多可以接入8个TCA9548A芯片,从而可以达到扩展出8*8=64路IIC的效果。

在什么情况下会使用到TCA9548A芯片来扩展?当一个MCU想要驱动多个器件地址相同的芯片时,如驱动8个OLED时,OLED的IIC器件地址为0x78,要用MCU引出8路IIC的硬件线路?显然得不偿失,这时候用TCA9548A就再合适不过了。

下面是我使用STM32F1通过一个TCA9548A驱动8个OLED的示例描述

STM32和TCA9548A配合使用需要注意的问题:

1)TCA9548A硬件电路的连接

STM32和TCA9548A连线的上拉电阻我使用的4.7K。

2)STM32按照上述电路图后的代码配置

void i2c_CfgGpio(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(OLED_RCC_I2C_PORT, ENABLE);

	GPIO_InitStructure.GPIO_Pin = OLED_I2C_SCL_PIN | OLED_I2C_SDA_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  	
	GPIO_Init(OLED_GPIO_PORT_I2C, &GPIO_InitStructure);

	i2c_Stop();
}

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  这句代码的配置很重要,模式配置的不对,很有可能不好用。

下面是关键部分测试代码:

bsp_oled.c

#ifndef __BSP_OLED_H
#define __BSP_OLED_H
#include "bsp_oled.h"
#endif

#ifndef __CODETAB_H
#define __CODETAB_H
#include "codetab.h"
#endif

void i2c_CfgGpio(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(OLED_RCC_I2C_PORT, ENABLE);

	GPIO_InitStructure.GPIO_Pin = OLED_I2C_SCL_PIN | OLED_I2C_SDA_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  	
	GPIO_Init(OLED_GPIO_PORT_I2C, &GPIO_InitStructure);

	i2c_Stop();
}


static void i2c_Delay(void)
{
	uint8_t i;
	for (i = 0; i < 10; i++);
}


void i2c_Start(void)
{
	OLED_I2C_SDA_1();
	OLED_I2C_SCL_1();
	i2c_Delay();
	OLED_I2C_SDA_0();
	i2c_Delay();
	OLED_I2C_SCL_0();
	i2c_Delay();
}


void i2c_Stop(void)
{
	OLED_I2C_SDA_0();
	OLED_I2C_SCL_1();
	i2c_Delay();
	OLED_I2C_SDA_1();
}


void i2c_SendByte(uint8_t _ucByte)
{
	uint8_t i;

	for (i = 0; i < 8; i++)
	{		
		if (_ucByte & 0x80)
		{
			OLED_I2C_SDA_1();
		}
		else
		{
			OLED_I2C_SDA_0();
		}
		i2c_Delay();
		OLED_I2C_SCL_1();
		i2c_Delay();	
		OLED_I2C_SCL_0();
		if (i == 7)
		{
			 OLED_I2C_SDA_1(); // ÊÍ·Å×ÜÏß
		}
		_ucByte <<= 1;
		i2c_Delay();
	}
}


uint8_t i2c_ReadByte(void)
{
	uint8_t i;
	uint8_t value;

	value = 0;
	for (i = 0; i < 8; i++)
	{
		value <<= 1;
		OLED_I2C_SCL_1();
		i2c_Delay();
		if (OLED_I2C_SDA_READ())
		{
			value++;
		}
		OLED_I2C_SCL_0();
		i2c_Delay();
	}
	return value;
}


 uint8_t i2c_WaitAck(void)
{
	uint8_t re;

	OLED_I2C_SDA_1();
	i2c_Delay();
	OLED_I2C_SCL_1();
	i2c_Delay();
	if (OLED_I2C_SDA_READ())
	{
		re = 1;
	}
	else
	{
		re = 0;
	}
	OLED_I2C_SCL_0();
	i2c_Delay();
	return re;
}


void i2c_Ack(void)
{
	OLED_I2C_SDA_0();
	i2c_Delay();
	OLED_I2C_SCL_1();
	i2c_Delay();
	OLED_I2C_SCL_0();
	i2c_Delay();
	OLED_I2C_SDA_1();
}


void i2c_NAck(void)
{
	OLED_I2C_SDA_1();	/* CPUÇý¶¯SDA = 1 */
	i2c_Delay();
	OLED_I2C_SCL_1();	/* CPU²úÉú1¸öʱÖÓ */
	i2c_Delay();
	OLED_I2C_SCL_0();
	i2c_Delay();	
}

void func_tca9548a_select(u8 chn)//0~7
{
	u8 ADDR_TCA9548A = 0x70;
	i2c_Start();
	i2c_SendByte((ADDR_TCA9548A << 1) | OLED_I2C_WR);
//	i2c_SendByte((ADDR_TCA9548A) | OLED_I2C_WR);
	
	if (i2c_WaitAck() != 0)
	{
		goto cmd_fail;	
	}
		
	i2c_SendByte(1 << chn);
	
	if (i2c_WaitAck() != 0)
	{
		goto cmd_fail;	
	}
	
	i2c_Stop();

cmd_fail:
	i2c_Stop();
}

u8 func_tca9548a_read_ch(void)
{
	u8 res;
	u8 ADDR_TCA9548A = 0x70;
	i2c_Start();
	i2c_SendByte((ADDR_TCA9548A << 1) | OLED_I2C_WR);
//	i2c_SendByte((ADDR_TCA9548A) | OLED_I2C_WR);
	
	if (i2c_WaitAck() != 0)
	{
		goto cmd_fail;
	}
	res = i2c_ReadByte();
	
	i2c_NAck();
	
	i2c_Stop();
	cmd_fail:
		i2c_Stop();
	
	return res;
}


uint8_t OLED_CheckDevice(uint8_t _Address)
{
	uint8_t ucAck;
	
	i2c_Start();		/* ·¢ËÍÆô¶¯ÐźŠ*/

	i2c_SendByte(_Address|OLED_I2C_WR);/* ·¢ËÍÉ豸µØÖ· */
	ucAck = i2c_WaitAck();	/* ¼ì²âÉ豸µÄACKÓ¦´ð */

	i2c_Stop();			/* ·¢ËÍÍ£Ö¹ÐźŠ*/

	return ucAck;
}



void I2C_WriteByte(uint8_t addr,uint8_t data){
	
	i2c_Start();
	
	i2c_SendByte(OLED_ADDRESS|OLED_I2C_WR);
	
	if (i2c_WaitAck() != 0)
	{
		goto cmd_fail;
	}
		
	i2c_SendByte(addr);
	
	if (i2c_WaitAck() != 0)
	{
		goto cmd_fail;
	}

	i2c_SendByte(data);
	
	if (i2c_WaitAck() != 0)
	{
		goto cmd_fail;
	}	
	
	i2c_Stop();

cmd_fail: 
	i2c_Stop();

}


void WriteCmd(unsigned char I2C_Command)//дÃüÁî
{
	I2C_WriteByte(0x00, I2C_Command);
}


void WriteDat(unsigned char I2C_Data)//дÊý¾Ý
{
	I2C_WriteByte(0x40, I2C_Data);
}


void OLED_Init(void)
{
	delay_ms(10);
	
	WriteCmd(0xAE); //display off
	WriteCmd(0x20);	//Set Memory Addressing Mode	
	WriteCmd(0x10);	//00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
	WriteCmd(0xb0);	//Set Page Start Address for Page Addressing Mode,0-7
	WriteCmd(0xc8);	//Set COM Output Scan Direction
	WriteCmd(0x00); //---set low column address
	WriteCmd(0x10); //---set high column address
	WriteCmd(0x40); //--set start line address
	WriteCmd(0x81); //--set contrast control register
	WriteCmd(0xff); //ÁÁ¶Èµ÷½Ú 0x00~0xff
	WriteCmd(0xa1); //--set segment re-map 0 to 127
	WriteCmd(0xa6); //--set normal display
	WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
	WriteCmd(0x3F); //
	WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
	WriteCmd(0xd3); //-set display offset
	WriteCmd(0x00); //-not offset
	WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
	WriteCmd(0xf0); //--set divide ratio
	WriteCmd(0xd9); //--set pre-charge period
	WriteCmd(0x22); //
	WriteCmd(0xda); //--set com pins hardware configuration
	WriteCmd(0x12);
	WriteCmd(0xdb); //--set vcomh
	WriteCmd(0x20); //0x20,0.77xVcc
	WriteCmd(0x8d); //--set DC-DC enable
	WriteCmd(0x14); //
	WriteCmd(0xaf); //--turn on oled panel
	
	OLED_CLS();
}


void OLED_SetPos(unsigned char x, unsigned char y) 
{ 
	WriteCmd(0xb0+y);
	WriteCmd(((x&0xf0)>>4)|0x10);
	WriteCmd((x&0x0f)|0x01);
}


void OLED_Fill(unsigned char fill_Data)//È«ÆÁÌî³ä
{
	unsigned char m,n;
	for(m=0;m<8;m++)
	{
		WriteCmd(0xb0+m);		//page0-page1
		WriteCmd(0x00);		//low column start address
		WriteCmd(0x10);		//high column start address
		for(n=0;n<130;n++)
			{
				WriteDat(fill_Data);
			}
	}
}


void OLED_CLS(void)//ÇåÆÁ
{
	OLED_Fill(0x00);
}



void OLED_ON(void)
{
	WriteCmd(0X8D);  //ÉèÖõçºÉ±Ã
	WriteCmd(0X14);  //¿ªÆôµçºÉ±Ã
	WriteCmd(0XAF);  //OLED»½ÐÑ
}



void OLED_OFF(void)
{
	WriteCmd(0X8D);  //ÉèÖõçºÉ±Ã
	WriteCmd(0X10);  //¹Ø±ÕµçºÉ±Ã
	WriteCmd(0XAE);  //OLEDÐÝÃß
}



void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
{
	unsigned char c = 0,i = 0,j = 0,k = 0;
	switch(TextSize)
	{
		case 1:
		{
			while(ch[j] != '\0')
			{
				c = ch[j] - 32;
				if(x > 126)
				{
					x = 0;
					y++;
				}
				OLED_SetPos(x,y);
				for(i=0;i<6;i++)
					WriteDat(F6x8[c][i]);
				x += 6;
				j++;
			}
		}break;
		case 2:
		{
			while(ch[j] != '\0')
			{
				c = ch[j] - 32;
				if(x > 120)
				{
					x = 0;
					y++;
				}
				OLED_SetPos(x,y);
				for(i=0;i<8;i++)
					WriteDat(F8X16[c*16+i]);
				OLED_SetPos(x,y+1);
				for(i=0;i<8;i++)
					WriteDat(F8X16[c*16+i+8]);
				x += 8;
				j++;
			}
		}break;
        case 3:
        {
            while(ch[j] != '\0')
            {
                c = ch[j] - 48;
                if(x > 120)
                {
                    x = 0;
                    y++;
                }
                for(k=0;k<4;k++)
                {
                    OLED_SetPos(x,y+k);
                    for(i=0;i<8;i++)
                        WriteDat(F16X32[c*16*4+k*16+i]);
                    OLED_SetPos(x+8,y+k);
                    for(i=0;i<8;i++)
                        WriteDat(F16X32[c*16*4+k*16+8+i]);
                }
                x += 16;
                j++;
        }
        case 4:
        {
            while(ch[j] != '\0')
            {
                c = ch[j];
                if(c >= '0')
                {
                    c -= '0';
                }
                else
                {
                    c = 10;
                }
                if(x > 120)
                {
                    x = 0;
                    y++;
                }
                for(k=0;k<6;k++)
                {
                    OLED_SetPos(x,y+k);
                    for(i=0;i<8;i++)
                        WriteDat(F24X48[c*16*9+k*24+i]);
                    OLED_SetPos(x+8,y+k);
                    for(i=0;i<8;i++)
                        WriteDat(F24X48[c*16*9+k*24+8+i]);
                    OLED_SetPos(x+16,y+k);
                    for(i=0;i<8;i++)
                        WriteDat(F24X48[c*16*9+k*24+16+i]);
                }
                x += 24;
                j++;
            }
        }
      }
	}
}

 
void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
{
	unsigned char wm=0;
	unsigned int  adder=32*N;
	OLED_SetPos(x , y);
	for(wm = 0;wm < 16;wm++)
	{
		WriteDat(F16x16[adder]);
		adder += 1;
	}
	OLED_SetPos(x,y + 1);
	for(wm = 0;wm < 16;wm++)
	{
		WriteDat(F16x16[adder]);
		adder += 1;
	}
}



void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
{
	unsigned int j=0;
	unsigned char x,y;

  if(y1%8==0)
		y = y1/8;
  else
		y = y1/8 + 1;
	for(y=y0;y<y1;y++)
	{
		OLED_SetPos(x0,y);
    for(x=x0;x<x1;x++)
		{
			WriteDat(BMP[j++]);
		}
	}
}



 uint8_t OLED_Test(void) 
{
  if (OLED_CheckDevice(OLED_ADDRESS) == 1)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}	



 void OLED_ShowTest(void) 
{
    unsigned char i; 
	  if(OLED_Test()==0)
		{          
			i = 1;
		}
		else
		{
			i = 2;
		}
		
//		while(1)
//	{
		OLED_Fill(0xFF);
		delay_s(1);
		
		OLED_Fill(0x00);
		delay_s(1);
		
		for(i=0;i<4;i++)
		{
			OLED_ShowCN(22+i*16,0,i);
		}
		delay_s(1);
		OLED_ShowStr(0,3,(unsigned char*)"Wildfire Tech",1);				
		OLED_ShowStr(0,4,(unsigned char*)"Hello wildfire",2);				
		delay_s(2);
		OLED_CLS();
		OLED_OFF();
		delay_s(1);
		OLED_ON();
		OLED_DrawBMP(0,0,128,8,(unsigned char *)BMP1);
		delay_s(1);
//	}    
}

main.c

#ifndef __STM32F10X_H
#define __STM32F10X_H
#include "stm32f10x.h"
#endif

#ifndef __BSP_BEEP_H
#define __BSP_BEEP_H
#include "bsp_beep.h"
#endif

#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "bsp_led.h"
#endif

#ifndef __BSP_OLED_H
#define __BSP_OLED_H
#include "bsp_oled.h"
#endif


int main()
{
	uint32_t tmp;
	
	init_beep();
	init_led();
	
	i2c_CfgGpio();
	
	func_led2_on();
	func_led3_on();
	func_led4_on();
	
	func_beep_play();
	for (tmp = 0; tmp < 3000000; tmp++);
	func_beep_stop();
	for (tmp = 0; tmp < 3000000; tmp++);
	
	func_tca9548a_select(0);//0~7	
	OLED_Init();					         	
	func_tca9548a_select(1);//0~7	
	OLED_Init();					         	
	func_tca9548a_select(2);//0~7	
	OLED_Init();					         	
	func_tca9548a_select(3);//0~7	
	OLED_Init();					         	
	func_tca9548a_select(4);//0~7	
	OLED_Init();					         	
	func_tca9548a_select(5);//0~7	
	OLED_Init();					         	
	func_tca9548a_select(6);//0~7	
	OLED_Init();					         	
	func_tca9548a_select(7);//0~7	
	OLED_Init();					       	
	
	for(;;)
	{
		func_tca9548a_select(0);
		OLED_ShowTest();
		func_tca9548a_select(1);
		OLED_ShowTest();
		func_tca9548a_select(2);
		OLED_ShowTest();
		func_tca9548a_select(3);
		OLED_ShowTest();
		func_tca9548a_select(4);
		OLED_ShowTest();
		func_tca9548a_select(5);
		OLED_ShowTest();
		func_tca9548a_select(6);
		OLED_ShowTest();
		func_tca9548a_select(7);
		OLED_ShowTest();
	}
	
}

注意,当STM32选择了TCA9548A的8个通道中的某一个后,TCA9548A就会保持这个通道,并透传IIC的消息,就可以直接向操作OLED一样发数据了。那么怎么选择TCA9548A的某一个通道呢?TCA9548A内部只有一个8位寄存器,置高的通道被选中。

最后就是效果了

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F1 TCA9548A 驱动多个IIC器件 的相关文章

  • scl sda 是什么接口_SOC设计控制接口IIC

    IIC全称为Inter Integrated Circuit 集成电路总线 IIC接口只有两根线 SCL SDA SCL为同步时钟线 SDA为数据线 通SPI不同的是 数据线为双向接口 也就是说 发送接收都走这根线 IIC是一种多向控制总线
  • STM32f103c8t6与iML7991的IIC通信

    一 iML7991 7991是应用在TFT LCD领域的P GAMMA芯片 xff0c 利用IIC对其内部的GAMMA值 xff08 共14个 xff09 进行设定 7991地址表参考图1 1 可以看到两个GAMMA值共用3个地址 xff0
  • 对IIC总线时序的一点理解以及ACK和NACK(NAK)

    参考自 xff1a http blog chinaunix net uid 16100003 id 3059814 html 关于IIC的响应问题 xff1a 对于每一个接收设备 xff08 从设备 xff0c slaver xff09 x
  • STM32 HAL库 STM32CubeMX -- I2C(IIC)

    文章目录 一 I2C 协议简介I2C 物理层I2C协议层I2C架构通讯过程 二 STM32Cube MX配置三 I2C HAL库函数 一 I2C 协议简介 I2C 通讯协议 Inter xff0d Integrated Circuit 也就
  • PX4-5-SPI-IIC设备驱动

    在之前的分享中 xff0c 我们聊了PX4的通信框架和任务调度框架 xff0c 现在我们讲一下PX4的设备驱动 PX4支持很多种设备 xff0c 根据通信方式的不同大致分为 xff1a SPI IIC设备 串口设备 IO设备 CAN设备 这
  • IIC通讯详解笔记

    IIC概述 IIC总线是一种串行半双工两线总线 一根是双向的数据线SDA xff0c 另一根是时钟线SCL 所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上 xff0c 各设备的时钟线SCL接到总线的SCL上 硬件拓扑如下图所示
  • IIC总线

    1 概念 IIC总线是PHLIPS公司在八十年代初推出的一种串行的半双工同步总线 xff0c 主要用于连接整体电路 同一块板子两个芯片之间的通信是通过IIC总线进行的 xff08 stm32mp157a lt IIC gt SI7006 I
  • DHT12温湿度传感器IIC,I2C接口调试心得和代码说明

    来源 xff1a http www fuhome net bbs forum php mod 61 viewthread amp tid 61 2141 DHT11那个单总线的温湿度传感器用的很多了 xff0c aosong推出了DHT12
  • TI CC265x的IIC通讯读取IMU BMI08x数据

    SmartLink CC265x是TI公司出的无线MCU平台器件 最近玩了个小项目用TI的CC265x平板IIC接口通讯 xff0c 获取博世BMI08x陀螺仪 加速度计传感器的数据 本篇博客亦是对博客 树莓派IIC通讯获取BMI08x I
  • 总线协议一(UART/RS232/RS485/IIC/SPI)

    目录 基础概述 xff1a 一 UART xff08 为串口通信方式 xff09 二 RS232协议 三 RS485协议 四 I2C总线协议 五 SPI总线 六 I2C和SPI的区别 基础概述 xff1a 总线的本质就是一根导线 xff0c
  • STM32软件模拟iic驱动oled(显示汉字,图片)(二)

    在上一篇介绍的软件模拟iic及iic源码后 xff0c 今天来实现显示汉字与图片以及各个函数的介绍 一 函数介绍及使用 1 显示字符 OLED ShowStr unsigned char x unsigned char y unsigned
  • STM32软件模拟iic驱动oled(显示汉字,图片)(一)

    一 iic驱动模式 1 硬件驱动 xff1a 所谓硬件驱动就是使用STM32板子上固定的iic接口 xff0c 但是由于板载iic数量有限 xff0c 且大多和别的外设有引脚复用 xff0c 在别的外设使用的情况下还得通过重映射引到别的引脚
  • UART、IIC、SPI、CAN通信的区别与应用

    文章目录 1 通信的基本知识1 1 数据通信的种类1 1 1 串行通信1 1 2 并行通信1 1 3 总结 1 2 数据通信的传输方向1 2 1 单工1 2 2 半双工1 2 3 全双工1 2 4 总结 1 3 数据通信的方式1 3 1 同
  • STM32 IIC详解

    目录 1 IIC定义 2 IIC协议规范 2 1 SDA和SCL信号 2 2 数据有效性 2 3 开始和结束信号 2 4 字节格式 2 5 从机地址和读写位 3 计算IIC的频率 4 PCF8536 4 1 Acknowledge 4 2
  • STM32标准库通用软件模拟IIC

    STM32标准库通用软件模拟IIC 继上次通用可移植的矩阵键盘之后 xff0c 便继续寻找着下一个能够拿来只需改改引脚就可以使用的通用方案 恰好最近在研究PCA9685 xff0c 这是一片能够产生最多十六路PWM信号的芯片 xff0c 通
  • Flash Download failed - “Cortex-M3“解决方法

    前几天在玩STM32F1的时候 烧录代码的时候出现这样一个错误 Error Flash Download failed Cortex M3 首先肯定要看配置问题 采用不同的仿真器 需要配置的选项就不同 这个完全可以自己看产品说明 当确定配置
  • AT24C02的使用说明和完整代码-51单片机

    AT24C02的使用说明和完整代码 51单片机 简述 at24c02为存储器芯片 可以使用单片机将数据存入其中 同时也可以任意读取 at24c02的原理及使用方法在其说明资料中已有充分的讲述 本篇仅对其使用的关键步骤进行罗列 以及说明一下具
  • 基于STM32 的IIC 模拟主机编写

    最近在学习STM32 的IIC IO 模拟主机方式 好像失败了 include myiic h include delay h MCU VERSION DATA 作者 other Function IIC
  • MBED移植日记:gpio_api移植(基于STM32F107RC)

    本文是继MBED串口API移植的又一篇系列文章 前阵子忙着赶项目 移植完了却没来得及写成文章来分享 今天来补上 一来可以温故知新 二来也可以献出自己的一点微薄之力 写的不好 移植的也不一定好 请大家多多指教 本文的gpio api模块与mb
  • I2C与SPI通信总线协议

    仅以寄存器地址为8Bit的器件为例 例如MPU6500 LSM6DS3 I2C通信协议 I2C 的要点是了解I2C通信帧的组成部分 START起始位 STOP停止位 ACK NACK信号 从机器件地址 从机寄存器地址 I2C读的时序比较繁琐

随机推荐

  • 【无标题】嘉立创EDA,stm32F4控制板。

  • 使用docker-compose连接mysql以及8.0版本遇到的身份验证问题解决方案

    docker compose 使用Docker部署环境非常方便 xff0c Compose项目是 Docker 官方的开源项目 xff0c 负责实现对 Docker 容器集群的快速编排 它允许用户通过一个单独的docker compose
  • EKF—SLAM推导

    转自 http blog csdn net qq 30159351 article details 53408740 这是SLAM最传统的基础 xff0c 是SLAM最原始的方法 xff0c 虽然现在使用较少 xff0c 但是还是有必要了解
  • PX4原生固件源码分析(挖坑)--1、代码结构

    写在开头 最近开始学习PX4源码 xff0c 并进行二次开发 xff0c 苦于网上缺少有关PX4源码的分析 xff0c 于是在这开个坑 xff0c 记录自己学习PX4的过程 xff0c 以此自勉 xff0c 笔者第一次写博客 xff0c 若
  • PX4原生固件源码分析(开填)--2、uORB消息

    写在开头 众所周知 xff0c PX4是通过Mavlink协议进行通信 xff0c 但是Mavlink只是用于外部的通信 xff0c 也就是和QGC地面站进行通信 xff0c 那么PX4中各任务模块相对独立 xff0c 它们之间是怎么通信的
  • 【超详细】基于大疆RoboMaster开发板C型的BMI088数据读取

    超详细 基于大疆RoboMaster开发板C型的BMI088数据读取 这里以博世传感器公司产出的BMI088型号的IMU为例 xff0c 其里面有3轴高精度加速度计和3轴高精度陀螺仪 xff0c 其他的特性不再介绍 同时这里的IMU是安装在
  • IMU综述

    IMU xff08 Inertial measurement unit xff09 xff0c 惯性测量单元 其作用是测量本身的加速度以及角速度 xff0c 有时还通过磁力计来测量朝向 xff0c 当包含磁力计时 xff0c IMU一般被称
  • 【超详细】磁力计数据读取--以IST8310为例

    这里以iSentek公司产出的IST8310型号的磁力计为例 xff0c 尺寸为 3 0 3 0 1 0mm xff0c 支持快速 I2C 通信 xff0c 可达 400kHz xff0c 14 位磁场数据 xff0c 测量范围可达1600
  • 【ADRC】扩张状态观测器(ESO)

    扩张状态观测器是自抗扰控制中非常重要的一个环节 xff0c 在我学习这部分内容后 xff0c 在写本篇文章时 xff0c 大致可以按照三个步骤来做实验 xff0c 推导 xff0c 由这三个步骤来由浅入深地去理解扩张状态观测器 ESO xf
  • 冰冻三尺非一日之寒-自学篇 浅谈个人学习方法

    昨晚还在看比赛 xff08 war3 xff09 xff0c 小源跑过来问我明天1024 xff0c 不写篇文章么 xff0c 想想也是 xff0c 1024这也算个热点 xff0c 赶紧来蹭蹭 xff0c 哈 xff0c 开个玩笑 上次谈
  • 栈中存储什么?

    一条线程对应一个栈 xff0c 一个方法对应一个栈帧 栈中 xff0c 存储的是一个一个的栈帧 xff0c 栈帧存储的是什么呢 xff1f 局部变量表 xff1a 存储的局部变量 xff0c 0位置代表this 操作数栈 xff1a 作用是
  • pdf导入pcb

    分为下面几步 xff1a 1 Illustrator 打开pdf 文件 导出为dxf 2 autocad 打开 xff0c 看看比例对不对 xff0c 缩放比例正确以后 xff0c 保存 旋转命令为rotate 测量为di 放大为sc 3
  • 如何在raspiberry pi上运行x86程序

    如何在raspiberry pi上运行x86程序 第一步 xff1a 下载ExaGear 步骤 xff1a 首选项 gt Add Remove Software gt 搜索ExaGear gt 下载搜索出来的四个包 第二步 xff1a 下载
  • 基于TINY4412的Andorid开发-------简单的LED灯控制【转】

    基于TINY4412的Andorid开发 简单的LED灯控制 阅读目录 Content 一 编写驱动程序二 编写代码测试驱动程序三 编写HAL代码四 编写Framework代码五 编写JNI代码六 编写App 参考资料 xff1a Andr
  • 计算机视觉——opencv-python

    opencv xff1a question1 10 main contentoriginal materialtrouble shootingq1 通道交换q2 灰度化q3 二值化q3 大津二值化算法 xff08 Otsu 39 s Met
  • 数字一阶低通滤波器simulink仿真

    数字一阶低通滤波器simulink仿真 原理程序所用公式滤波系数计算方法 仿真根据公式搭建使用simulink自带模型 原理 程序所用公式 y n 61 q x n 43 1 q y n 1 其中 xff0c y n 表示当前的输出 xff
  • SDFormat

    http sdformat org
  • putty远程连接不上虚拟机里的linux

    昨天跟着阿铭的视频在虚拟机中搭建了centos6 xff0c 然后用putty远程连接成功 今天中午鼓弄putty 的时候 xff0c 连接就报错了 xff1a network error xff1a connection refuse 网
  • 【ADRC】根据ADRC的思想改进PID

    根据前面两篇关于ADRC的文章以及PID原理的文章 xff0c 我们可以利用ADRC的思想来对PID算法做一些改进来看看效果 xff0c 可以将改进的PID称之为非线性PID 主要可以利用跟踪微分器 xff0c 针对PID的两个缺陷来进行改
  • STM32F1 TCA9548A 驱动多个IIC器件

    TCA9548A的用途就是IIC扩展 xff0c 每个TCA9548A可以扩展出8路IIC TCA9548A芯片带有地址选择引脚A0 A1 A2 xff0c 根据高低电平不同 xff0c 从MCU的一路IIC最多可以接入8个TCA9548A