39. I2C实验

一、IIC协议详解

1、ALPHA开发板上有个AP3216C,这是一个IIC接口的器件,这是一个环境光传感器。AP3216C连接到了I2C1上:
I2C1_SCL: 使用的是UART4_TXD这个IO,复用位ALT2
I2C1_SDA: 使用的是UART4_RXD这个IO。复用为ALT2

2、I2C分为SCL和SDA,这两个必须要接上拉电阻到VCC,比如3.3V,一般是4.7K上拉电阻。
3、I2C总线支持多从机,通过从机地址来区分访问哪个从机。

二、6ULL I2C接口详解

1、6UL的I2C频率标准模式100kbit/S,快速模式400Kbit/S
2、时钟源选择perclk_clk_root=ipg_clk_root=66MHz
3、IFDR寄存器设置I2C频率,bit5:0设置频分值,假如我们现在需要100kbit的速率,那么66000000/100000=660。经过查找IC位设置位0X38或0X15的时候,为640分频,66000000/640=103.125Kbit.
4、I2CR寄存器,bit7为I2C使能位,置1使能I2C。bit5为主从模式选择位,为0表示从机,为1表示主机。Bit4为发送/接收设置位,为0的时候是接收,为1的时候是发送
5、I2SR寄存器,bit7为传输完成位,为0表示正在发送,为1表示发送完成。Bit5是I2C忙闲位,为0的时候I2C总线空闲,为1的时候I2C总线忙。Bit0是读确认位,也就是ACK信号
6、I2DR寄存器,数据寄存器。

三、AP3216C简介

1、AP3216C是一个三合一的环境光传感器,ALS+PS+IRLED,ALS是环境光,PS是接近传感器,IR是红外LED灯。I2C接口,最高400Kbit/S的频率。
2、环境光,ALS是16位输出。
3、接近传感器PS,10bit输出。IR传感器也是10bit
4、AP3216C的从机地址位0X1E。
5、0X0A是IR Ddata low。Bit7为0的时候表示IR和PS数据有效,为1的时候IR和PS数据无效。Bit1:0是IR的低2位。
6、0X0B是IR Data high,big7:0是高字节。与0X0A一起组成10bit的数据。
7、0X0C和0X0D分别位ALS的低8位和高8位。
8、0X0E的bit3:0是低4位数据,0X0F的bit5:0是高6位数据。加起来就是10位
9、0X00是系统配置寄存器,bit2:0设置AP3216C开始那些传感器,我们需要设置位011,也就是0x3,表示开始ALS+PS+IR。

四、实验程序编写

//bsp_i2c.c

#include "bsp_i2c.h"
#include "bsp_delay.h"
#include "stdio.h"/** @description     : 初始化I2C,波特率100KHZ* @param - base    : 要初始化的IIC设置* @return          : 无*/
void i2c_init(I2C_Type *base)
{/* 1、配置I2C */base->I2CR &= ~(1 << 7); /* 要访问I2C的寄存器,首先需要先关闭I2C *//* 设置波特率为100K* I2C的时钟源来源于IPG_CLK_ROOT=66Mhz* IC2 时钟 = PERCLK_ROOT/dividison(IFDR寄存器)* 设置寄存器IFDR,IFDR寄存器参考IMX6UL参考手册P1260页,表29-3,* 根据表29-3里面的值,挑选出一个还是的分频数,比如本例程我们* 设置I2C的波特率为100K, 因此当分频值=66000000/100000=660.* 在表29-3里面查找,没有660这个值,但是有640,因此就用640,* 即寄存器IFDR的IC位设置为0X15*/base->IFDR = 0X15 << 0;/** 设置寄存器I2CR,开启I2C* bit[7] : 1 使能I2C,I2CR寄存器其他位其作用之前,此位必须最先置1*/base->I2CR |= (1<<7);
}/** @description         : 发送重新开始信号* @param - base        : 要使用的IIC* @param - addrss      : 设备地址* @param - direction   : 方向* @return              : 0 正常 其他值 出错*/
unsigned char i2c_master_repeated_start(I2C_Type *base, unsigned char address,  enum i2c_direction direction)
{/* I2C忙并且工作在从模式,跳出 */if(base->I2SR & (1 << 5) && (((base->I2CR) & (1 << 5)) == 0))       return 1;/** 设置寄存器I2CR* bit[4]: 1 发送* bit[2]: 1 产生重新开始信号*/base->I2CR |=  (1 << 4) | (1 << 2);/** 设置寄存器I2DR* bit[7:0] : 要发送的数据,这里写入从设备地址*            参考资料:IMX6UL参考手册P1249*/ base->I2DR = ((unsigned int)address << 1) | ((direction == kI2C_Read)? 1 : 0);return 0;
}/** @description         : 发送开始信号* @param - base        : 要使用的IIC* @param - addrss      : 设备地址* @param - direction   : 方向* @return              : 0 正常 其他值 出错*/
unsigned char i2c_master_start(I2C_Type *base, unsigned char address,  enum i2c_direction direction)
{if(base->I2SR & (1 << 5))           /* I2C忙 */return 1;/** 设置寄存器I2CR* bit[5]: 1 主模式* bit[4]: 1 发送*/base->I2CR |=  (1 << 5) | (1 << 4);/** 设置寄存器I2DR* bit[7:0] : 要发送的数据,这里写入从设备地址*            参考资料:IMX6UL参考手册P1249*/ base->I2DR = ((unsigned int)address << 1) | ((direction == kI2C_Read)? 1 : 0);return 0;
}/** @description     : 检查并清除错误* @param - base    : 要使用的IIC* @param - status  : 状态* @return          : 状态结果*/
unsigned char i2c_check_and_clear_error(I2C_Type *base, unsigned int status)
{/* 检查是否发生仲裁丢失错误 */if(status & (1<<4)){base->I2SR &= ~(1<<4);      /* 清除仲裁丢失错误位            */base->I2CR &= ~(1 << 7);    /* 先关闭I2C               */base->I2CR |= (1 << 7);     /* 重新打开I2C              */return I2C_STATUS_ARBITRATIONLOST;} else if(status & (1 << 0))      /* 没有接收到从机的应答信号 */{return I2C_STATUS_NAK;      /* 返回NAK(No acknowledge) */}return I2C_STATUS_OK;
}/** @description     : 停止信号* @param - base    : 要使用的IIC* @param           : 无* @return          : 状态结果*/
unsigned char i2c_master_stop(I2C_Type *base)
{unsigned short timeout = 0xffff;/** 清除I2CR的bit[5:3]这三位*/base->I2CR &= ~((1 << 5) | (1 << 4) | (1 << 3));/* 等待忙结束 */while((base->I2SR & (1 << 5))){timeout--;if(timeout == 0)    /* 超时跳出 */return I2C_STATUS_TIMEOUT;}return I2C_STATUS_OK;
}/** @description     : 发送数据* @param - base    : 要使用的IIC* @param - buf     : 要发送的数据* @param - size    : 要发送的数据大小* @param - flags   : 标志* @return          : 无*/
void i2c_master_write(I2C_Type *base, const unsigned char *buf, unsigned int size)
{/* 等待传输完成 */while(!(base->I2SR & (1 << 7))); base->I2SR &= ~(1 << 1);    /* 清除标志位 */base->I2CR |= 1 << 4;       /* 发送数据 */while(size--){base->I2DR = *buf++;    /* 将buf中的数据写入到I2DR寄存器 */while(!(base->I2SR & (1 << 1)));    /* 等待传输完成 */    base->I2SR &= ~(1 << 1);            /* 清除标志位 *//* 检查ACK */if(i2c_check_and_clear_error(base, base->I2SR))break;}base->I2SR &= ~(1 << 1);i2c_master_stop(base);  /* 发送停止信号 */
}/** @description     : 读取数据* @param - base    : 要使用的IIC* @param - buf     : 读取到数据* @param - size    : 要读取的数据大小* @return          : 无*/
void i2c_master_read(I2C_Type *base, unsigned char *buf, unsigned int size)
{volatile uint8_t dummy = 0;dummy++;    /* 防止编译报错 *//* 等待传输完成 */while(!(base->I2SR & (1 << 7))); base->I2SR &= ~(1 << 1);                /* 清除中断挂起位 */base->I2CR &= ~((1 << 4) | (1 << 3));   /* 接收数据 *//* 如果只接收一个字节数据的话发送NACK信号 */if(size == 1)base->I2CR |= (1 << 3);dummy = base->I2DR; /* 假读 */while(size--){while(!(base->I2SR & (1 << 1)));    /* 等待传输完成 */    base->I2SR &= ~(1 << 1);            /* 清除标志位 */if(size == 0){i2c_master_stop(base);          /* 发送停止信号 */}if(size == 1){base->I2CR |= (1 << 3);}*buf++ = base->I2DR;}
}/** @description : I2C数据传输,包括读和写* @param - base: 要使用的IIC* @param - xfer: 传输结构体* @return      : 传输结果,0 成功,其他值 失败;*/
unsigned char i2c_master_transfer(I2C_Type *base, struct i2c_transfer *xfer)
{unsigned char ret = 0;enum i2c_direction direction = xfer->direction;    base->I2SR &= ~((1 << 1) | (1 << 4));           /* 清除标志位 *//* 等待传输完成 */while(!((base->I2SR >> 7) & 0X1)){}; /* 如果是读的话,要先发送寄存器地址,所以要先将方向改为写 */if ((xfer->subaddressSize > 0) && (xfer->direction == kI2C_Read)){direction = kI2C_Write;}ret = i2c_master_start(base, xfer->slaveAddress, direction); /* 发送开始信号 */if(ret){   return ret;}while(!(base->I2SR & (1 << 1))){};          /* 等待传输完成 */ret = i2c_check_and_clear_error(base, base->I2SR);  /* 检查是否出现传输错误 */if(ret){i2c_master_stop(base);                      /* 发送出错,发送停止信号 */return ret;}/* 发送寄存器地址 */if(xfer->subaddressSize){do{base->I2SR &= ~(1 << 1);            /* 清除标志位 */xfer->subaddressSize--;             /* 地址长度减一 */base->I2DR =  ((xfer->subaddress) >> (8 * xfer->subaddressSize)); //向I2DR寄存器写入子地址while(!(base->I2SR & (1 << 1)));    /* 等待传输完成 *//* 检查是否有错误发生 */ret = i2c_check_and_clear_error(base, base->I2SR);if(ret){i2c_master_stop(base);              /* 发送停止信号 */return ret;}  } while ((xfer->subaddressSize > 0) && (ret == I2C_STATUS_OK));if(xfer->direction == kI2C_Read)        /* 读取数据 */{base->I2SR &= ~(1 << 1);            /* 清除中断挂起位 */i2c_master_repeated_start(base, xfer->slaveAddress, kI2C_Read); /* 发送重复开始信号和从机地址 */while(!(base->I2SR & (1 << 1))){};/* 等待传输完成 *//* 检查是否有错误发生 */ret = i2c_check_and_clear_error(base, base->I2SR);if(ret){ret = I2C_STATUS_ADDRNAK;i2c_master_stop(base);      /* 发送停止信号 */return ret;  }}}   /* 发送数据 */if ((xfer->direction == kI2C_Write) && (xfer->dataSize > 0)){i2c_master_write(base, xfer->data, xfer->dataSize);}/* 读取数据 */if ((xfer->direction == kI2C_Read) && (xfer->dataSize > 0)){i2c_master_read(base, xfer->data, xfer->dataSize);}return 0;   
}

//bsp_i2c.h

#ifndef _BSP_I2C_H
#define _BSP_I2C_H
#include "imx6ul.h"/* 相关宏定义 */
#define I2C_STATUS_OK               (0)
#define I2C_STATUS_BUSY             (1)
#define I2C_STATUS_IDLE             (2)
#define I2C_STATUS_NAK              (3)
#define I2C_STATUS_ARBITRATIONLOST  (4)
#define I2C_STATUS_TIMEOUT          (5)
#define I2C_STATUS_ADDRNAK          (6)/** I2C方向枚举类型*/
enum i2c_direction
{kI2C_Write = 0x0,       /* 主机向从机写数据 */kI2C_Read = 0x1,        /* 主机从从机读数据 */
} ;/** 主机传输结构体*/
struct i2c_transfer
{unsigned char slaveAddress;         /* 7位从机地址           */enum i2c_direction direction;       /* 传输方向             */unsigned int subaddress;            /* 寄存器地址            */unsigned char subaddressSize;       /* 寄存器地址长度          */unsigned char *volatile data;       /* 数据缓冲区            */volatile unsigned int dataSize;     /* 数据缓冲区长度          */
};/**函数声明*/
void i2c_init(I2C_Type *base);
unsigned char i2c_master_start(I2C_Type *base, unsigned char address, enum i2c_direction direction);
unsigned char i2c_master_repeated_start(I2C_Type *base, unsigned char address,  enum i2c_direction direction);
unsigned char i2c_check_and_clear_error(I2C_Type *base, unsigned int status);
unsigned char i2c_master_stop(I2C_Type *base);
void i2c_master_write(I2C_Type *base, const unsigned char *buf, unsigned int size);
void i2c_master_read(I2C_Type *base, unsigned char *buf, unsigned int size);
unsigned char i2c_master_transfer(I2C_Type *base, struct i2c_transfer *xfer);#endif

//bsp_ap3216c.c

#include "bsp_ap3216c.h"
#include "bsp_i2c.h"
#include "bsp_delay.h"
#include "cc.h"
#include "stdio.h"/** @description : 初始化AP3216C* @param       : 无* @return      : 0 成功,其他值 错误代码*/
unsigned char ap3216c_init(void)
{unsigned char data = 0;/* 1、IO初始化,配置I2C IO属性   * I2C1_SCL -> UART4_TXD* I2C1_SDA -> UART4_RXD*/IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL, 1);IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA, 1);/* *bit 16:0 HYS关闭*bit [15:14]: 1 默认47K上拉*bit [13]: 1 pull功能*bit [12]: 1 pull/keeper使能 *bit [11]: 0 关闭开路输出*bit [7:6]: 10 速度100Mhz*bit [5:3]: 110 驱动能力为R0/6*bit [0]: 1 高转换率*/IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL, 0x70B0);IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA, 0X70B0);i2c_init(I2C1);     /* 初始化I2C1 *//* 2、初始化AP3216C */ap3216c_writeonebyte(AP3216C_ADDR, AP3216C_SYSTEMCONG, 0X04);   /* 复位AP3216C            */delayms(50);                                                    /* AP33216C复位至少10ms */ap3216c_writeonebyte(AP3216C_ADDR, AP3216C_SYSTEMCONG, 0X03);   /* 开启ALS、PS+IR          */data = ap3216c_readonebyte(AP3216C_ADDR, AP3216C_SYSTEMCONG);   /* 读取刚刚写进去的0X03 */if(data == 0X03)return 0;   /* AP3216C正常    */else return 1;   /* AP3216C失败    */
}/** @description : 向AP3216C写入数据* @param - addr: 设备地址* @param - reg : 要写入的寄存器* @param - data: 要写入的数据* @return      : 操作结果*/
unsigned char ap3216c_writeonebyte(unsigned char addr,unsigned char reg, unsigned char data)
{unsigned char status=0;unsigned char writedata=data;struct i2c_transfer masterXfer;/* 配置I2C xfer结构体 */masterXfer.slaveAddress = addr;             /* 设备地址                 */masterXfer.direction = kI2C_Write;          /* 写入数据                 */masterXfer.subaddress = reg;                /* 要写入的寄存器地址            */masterXfer.subaddressSize = 1;              /* 地址长度一个字节             */masterXfer.data = &writedata;               /* 要写入的数据               */masterXfer.dataSize = 1;                    /* 写入数据长度1个字节           */if(i2c_master_transfer(I2C1, &masterXfer))status=1;return status;
}/** @description : 从AP3216C读取一个字节的数据* @param - addr: 设备地址* @param - reg : 要读取的寄存器* @return      : 读取到的数据。*/
unsigned char ap3216c_readonebyte(unsigned char addr,unsigned char reg)
{unsigned char val=0;struct i2c_transfer masterXfer; masterXfer.slaveAddress = addr;             /* 设备地址                 */masterXfer.direction = kI2C_Read;           /* 读取数据                 */masterXfer.subaddress = reg;                /* 要读取的寄存器地址            */masterXfer.subaddressSize = 1;              /* 地址长度一个字节             */masterXfer.data = &val;                     /* 接收数据缓冲区              */masterXfer.dataSize = 1;                    /* 读取数据长度1个字节           */i2c_master_transfer(I2C1, &masterXfer);return val;
}/** @description : 读取AP3216C的数据,读取原始数据,包括ALS,PS和IR, 注意!*              : 如果同时打开ALS,IR+PS的话两次数据读取的时间间隔要大于112.5ms* @param - ir  : ir数据* @param - ps  : ps数据* @param - ps  : als数据 * @return      : 无。*/
void ap3216c_readdata(unsigned short *ir, unsigned short *ps, unsigned short *als)
{unsigned char buf[6];unsigned char i;/* 循环读取所有传感器数据 */for(i = 0; i < 6; i++)  {buf[i] = ap3216c_readonebyte(AP3216C_ADDR, AP3216C_IRDATALOW + i);  }if(buf[0] & 0X80)   /* IR_OF位为1,则数据无效 */*ir = 0;                    else                /* 读取IR传感器的数据           */*ir = ((unsigned short)buf[1] << 2) | (buf[0] & 0X03);          *als = ((unsigned short)buf[3] << 8) | buf[2];  /* 读取ALS传感器的数据           */  if(buf[4] & 0x40)   /* IR_OF位为1,则数据无效           */*ps = 0;                                                        else                /* 读取PS传感器的数据    */*ps = ((unsigned short)(buf[5] & 0X3F) << 4) | (buf[4] & 0X0F);     
}

//bsp_ap3216c.h

#ifndef _BSP_AP3216C_H
#define _BSP_AP3216C_H
#include "imx6ul.h"#define AP3216C_ADDR        0X1E    /* AP3216C器件地址 *//* AP3316C寄存器 */
#define AP3216C_SYSTEMCONG  0x00    /* 配置寄存器            */
#define AP3216C_INTSTATUS   0X01    /* 中断状态寄存器          */
#define AP3216C_INTCLEAR    0X02    /* 中断清除寄存器          */
#define AP3216C_IRDATALOW   0x0A    /* IR数据低字节          */
#define AP3216C_IRDATAHIGH  0x0B    /* IR数据高字节          */
#define AP3216C_ALSDATALOW  0x0C    /* ALS数据低字节         */
#define AP3216C_ALSDATAHIGH 0X0D    /* ALS数据高字节         */
#define AP3216C_PSDATALOW   0X0E    /* PS数据低字节          */
#define AP3216C_PSDATAHIGH  0X0F    /* PS数据高字节          *//* 函数声明 */
unsigned char ap3216c_init(void);
unsigned char ap3216c_readonebyte(unsigned char addr,unsigned char reg);
unsigned char ap3216c_writeonebyte(unsigned char addr,unsigned char reg, unsigned char data);
void ap3216c_readdata(unsigned short *ir, unsigned short *ps, unsigned short *als);#endif

//main.c

/**************************************************************
描述     : I.MX6U开发板裸机实验18 IIC实验
其他     : IIC是最常用的接口,ZERO开发板上有多个IIC外设,本实验就来学习如何驱动I.MX6U的IIC接口,并且通过IIC接口读取板载AP3216C的数据值。
**************************************************************/
#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"
#include "bsp_key.h"
#include "bsp_int.h"
#include "bsp_uart.h"
#include "bsp_lcd.h"
#include "bsp_rtc.h"
#include "bsp_ap3216c.h"
#include "stdio.h"/** @description : main函数* @param       : 无* @return      : 无*/
int main(void)
{unsigned short ir, als, ps;unsigned char state = OFF;int_init();                 /* 初始化中断(一定要最先调用!) */imx6u_clkinit();            /* 初始化系统时钟          */delay_init();               /* 初始化延时            */clk_enable();               /* 使能所有的时钟          */led_init();                 /* 初始化led           */beep_init();                /* 初始化beep          */uart_init();                /* 初始化串口,波特率115200 */lcd_init();                 /* 初始化LCD           */tftlcd_dev.forecolor = LCD_RED; lcd_show_string(30, 50, 200, 16, 16, (char*)"ZERO-IMX6U IIC TEST");  lcd_show_string(30, 70, 200, 16, 16, (char*)"AP3216C TEST");  lcd_show_string(30, 90, 200, 16, 16, (char*)"ATOM@ALIENTEK");  lcd_show_string(30, 110, 200, 16, 16, (char*)"2019/3/26");  while(ap3216c_init())       /* 检测不到AP3216C */{lcd_show_string(30, 130, 200, 16, 16, (char*)"AP3216C Check Failed!");delayms(500);lcd_show_string(30, 130, 200, 16, 16, (char*)"Please Check!        ");delayms(500);}   lcd_show_string(30, 130, 200, 16, 16, (char*)"AP3216C Ready!");  lcd_show_string(30, 160, 200, 16, 16, (char*)" IR:");    lcd_show_string(30, 180, 200, 16, 16, (char*)" PS:");   lcd_show_string(30, 200, 200, 16, 16, (char*)"ALS:");   tftlcd_dev.forecolor = LCD_BLUE;    while(1)                    {ap3216c_readdata(&ir, &ps, &als);       /* 读取数据         */lcd_shownum(30 + 32, 160, ir, 5, 16);   /* 显示IR数据       */lcd_shownum(30 + 32, 180, ps, 5, 16);   /* 显示PS数据       */lcd_shownum(30 + 32, 200, als, 5, 16);  /* 显示ALS数据  */ delayms(120);state = !state;led_switch(LED0,state); }return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/68862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 深拷贝与浅拷贝:数据复制的奥秘及回溯算法中的应用

引言 在 Python 编程领域&#xff0c;数据复制是极为常见的操作。而深拷贝和浅拷贝这两个概念&#xff0c;如同紧密关联却又各具特色的双子星&#xff0c;在数据处理过程中扮演着重要角色。深入理解它们&#xff0c;不仅有助于编写出高效、准确的代码&#xff0c;还能避免许多…

《基于Scapy的综合性网络扫描与通信工具集解析》

在网络管理和安全评估中&#xff0c;网络扫描和通信是两个至关重要的环节。Python 的 Scapy 库因其强大的网络数据包处理能力&#xff0c;成为开发和实现这些功能的理想工具。本文将介绍一个基于 Scapy 编写的 Python 脚本&#xff0c;该脚本集成了 ARP 扫描、端口扫描以及 TCP…

GEE | 计算Sentinel-2的改进型土壤调整植被指数MSAVI

同学们好&#xff01;今天和大家分享的是 “改进型土壤调整植被指数MSAVI”&#xff0c;它能够更准确地反映植被生长状态&#xff0c;且广泛应用于植被覆盖监测、生态环境评估等领域。 1. MSAVI 改进型土壤调整植被指数&#xff08;MSAVI&#xff09;是一种针对植被覆盖区域土…

[c语言日寄]C语言类型转换规则详解

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

进阶数据结构——双向循环链表

目录 前言一、定义与结构二、特点与优势三、基本操作四、应用场景五、实现复杂度六、动态图解七、代码模版&#xff08;c&#xff09;八、经典例题九、总结结语 前言 这一期我们学习双向循环链表。双向循环链表不同于单链表&#xff0c;双向循环链表是一种特殊的数据结构&…

稀疏混合专家架构语言模型(MoE)

注&#xff1a;本文为 “稀疏混合专家架构语言模型&#xff08;MoE&#xff09;” 相关文章合辑。 手把手教你&#xff0c;从零开始实现一个稀疏混合专家架构语言模型&#xff08;MoE&#xff09; 机器之心 2024年02月11日 12:21 河南 选自huggingface 机器之心编译 机器之心…

PVE 中 Debian 虚拟机崩溃后,硬盘数据怎么恢复

问题 在 PVE 中给 Debian 虚拟机新分配硬盘后&#xff0c;通过 Debian 虚拟机开启 Samba 共享该硬盘。如果这个 Debian 虚拟机崩溃后&#xff0c;怎么恢复 Samba 共享硬盘数据。 方法 开启 Samba 共享相关知识&#xff1a;挂载硬盘和开启Samba共享。 新建一个虚拟机&#xf…

Baklib如何改变内容管理平台的未来推动创新与效率提升

内容概要 在信息爆炸的时代&#xff0c;内容管理平台成为了企业和个人不可或缺的工具。它通过高效组织、存储和发布内容&#xff0c;帮助用户有效地管理信息流。随着技术的发展&#xff0c;传统的内容管理平台逐渐暴露出灵活性不足、易用性差等局限性&#xff0c;这促使市场需…

想品客老师的第天:类

类是一个优化js面向对象的工具 类的声明 //1、class User{}console.log(typeof User)//function//2、let Hdclass{}//其实跟1差不多class Stu{show(){}//注意这里不用加逗号&#xff0c;对象才加逗号get(){console.log(后盾人)}}let hdnew Stu()hd.get()//后盾人 类的原理 类…

Java 大视界 -- Java 大数据在自动驾驶中的数据处理与决策支持(68)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

基于springboot私房菜定制上门服务系统设计与实现(源码+数据库+文档)

私房菜定制上门服务系统目录 目录 基于springbootvue私房菜定制上门服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;菜品管理 &#xff08;2&#xff09;公告管理 &#xff08;3&#xff09; 厨师管理 2、用…

15JavaWeb——Maven高级篇

Maven高级 Web开发讲解完毕之后&#xff0c;我们再来学习Maven高级。其实在前面的课程当中&#xff0c;我们已经学习了Maven。 我们讲到 Maven 是一款构建和管理 Java 项目的工具。经过前面 10 多天 web 开发的学习&#xff0c;相信大家对于 Maven 这款工具的基本使用应该没什…

基于Python的药物相互作用预测模型AI构建与优化(上.文字部分)

一、引言 1.1 研究背景与意义 在临床用药过程中,药物相互作用(Drug - Drug Interaction, DDI)是一个不可忽视的重要问题。当患者同时服用两种或两种以上药物时,药物之间可能会发生相互作用,从而改变药物的疗效、增加不良反应的发生风险,甚至危及患者的生命安全。例如,…

1.Template Method 模式

模式定义 定义一个操作中的算法的骨架&#xff08;稳定&#xff09;&#xff0c;而将一些步骤延迟&#xff08;变化)到子类中。Template Method 使得子类可以不改变&#xff08;复用&#xff09;一个算法的结构即可重定义&#xff08;override 重写&#xff09;该算法的某些特…

16.[前端开发]Day16-HTML+CSS阶段练习(网易云音乐五)

完整代码 网易云-main-left-rank&#xff08;排行榜&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&q…

使用Pygame制作“走迷宫”游戏

1. 前言 迷宫游戏是最经典的 2D 游戏类型之一&#xff1a;在一个由墙壁和通道构成的地图里&#xff0c;玩家需要绕过障碍、寻找通路&#xff0c;最终抵达出口。它不但简单易实现&#xff0c;又兼具可玩性&#xff0c;还能在此基础上添加怪物、道具、机关等元素。本篇文章将展示…

Python之Excel操作 - 写入数据

我们将使用 openpyxl 库&#xff0c;它是一个功能强大且易于使用的库&#xff0c;专门用于处理 Excel 文件。 1. 安装 openpyxl 首先&#xff0c;你需要安装 openpyxl 库。你可以使用 pip 命令进行安装&#xff1a; pip install openpyxl创建一个文件 example.xlsx&#xff…

C++解决输入空格字符串的三种方法

一.gets和fgets char * gets ( char * str ); char * fgets ( char * str, int num, FILE * stream ); 1. gets 是从第⼀个字符开始读取&#xff0c;⼀直读取到 \n 停⽌&#xff0c;但是不会读取 \n &#xff0c;也就是读取到的内容 中没有包含 \n ,但是会在读取到的内…

99.20 金融难点通俗解释:中药配方比喻马科维茨资产组合模型(MPT)

目录 0. 承前1. 核心知识点拆解2. 中药搭配比喻方案分析2.1 比喻的合理性 3. 通俗易懂的解释3.1 以中药房为例3.2 配方原理 4. 实际应用举例4.1 基础配方示例4.2 效果说明 5. 注意事项5.1 个性化配置5.2 定期调整 6. 总结7. 代码实现 0. 承前 本文主旨&#xff1a; 本文通过中…

Spring Boot + Facade Pattern : 通过统一接口简化多模块业务

文章目录 Pre概述在编程中&#xff0c;外观模式是如何工作的&#xff1f;外观设计模式 UML 类图外观类和子系统的关系优点案例外观模式在复杂业务中的应用实战运用1. 项目搭建与基础配置2. 构建子系统组件航班服务酒店服务旅游套餐服务 3. 创建外观类4. 在 Controller 中使用外…