TMS320F28P550SJ9学习笔记8:I2C通信的结构体寄存器配置的了解
继续学习IIC通信的寄存器配置方式:尝试使用寄存器方式配置了解I2C a
没条件完整测试IIC功能,具体的修改与测试留在下文,这里只贴出全部代码,就不提供工程了
文章提供测试代码讲解、完整工程下载、测试效果图
目录
IIC通信引脚:
I2CPSC 寄存器配置:
I2CCLKH 和 I2CCLKL寄存器配置:
I2CMDR 寄存器配置:
I2CCNT 寄存器配置:
I2CDRR 和 I2CDXR寄存器配置:
I2CEMDR 寄存器配置:
I2CFFRX 寄存器配置:
I2CFFTX 寄存器配置:
I2CIER 寄存器配置:
I2CISRC 寄存器配置:
I2COAR 寄存器配置:
I2CSTR 寄存器配置:
I2CTAR 寄存器配置:
整体寄存器相关代码配置:
I2C中断服务函数:
测试效果图:
完整工程下载:
我的单片机平台是这个:
IIC通信引脚:
GPIO26 SDA
GPIO27 SCL
I2CPSC 寄存器配置:
分频 辅助设定I2C 模块的频率,从SYSTICK分频而来
这里设定的分频可以将I2C模块的频率设定为10Mhz
// SYSTICK 150MHz ---> IIC 10Mhz // 150MHz / (14 + 1 ) = 10Mhz I2caRegs.I2CPSC.all=14; // PSC > 1 d = 5
I2CCLKH 和 I2CCLKL寄存器配置:
设定I2C时钟线频率
// 设定I2C 时钟线频率 10MHz / (10 + d) + (5 + d) = 400 k I2caRegs.I2CCLKH=5; I2caRegs.I2CCLKL=10;
I2CMDR 寄存器配置:
手册3216页:
//这里 IRS 先置0 释放总线,后续全部配置完毕 再置1 启用I2C模块I2caRegs.I2CMDR.bit.IRS = 0; // 0: I2C模块处于重置/禁用状态。当该位清除到0时,所有状态位(在I2CSTR中)都设置为其默认值。 1:I2C模块被启用。I2caRegs.I2CMDR.bit.BC = 0; // 定义数据字节中的比特数(1到8)0:8bit 1~7: 1~7 bitI2caRegs.I2CMDR.bit.CNT = 1; // 0:TARGET模式:I2C模块从控制器接收串行时钟 1:CONTROLLER模式:I2C模块作为控制器,在SCL引脚上生成串行时钟 I2caRegs.I2CMDR.bit.DLB = 0; // 0:关闭数字回环模式 1:开启// 数字环回模式 DLB 下,从I2CDXR接收的数据会在n个设备周期之后,通过内部路径传输到I2CDRR。其中n = ((I2C输入时钟频率/模块时钟频率) x 8)。I2caRegs.I2CMDR.bit.FDF = 0; // 0:禁用自由数据格式模式,传输使用由XA位选择的7-/10-bit寻址格式 1:启用自由数据格式模式,传输使用自由数据(无地址)格式,//但此 FDF 格式在数字回环模式(DLB=1)下不受支持。I2caRegs.I2CMDR.bit.FREE = 1; // O:执行非FREE自由行为 1:I2C模块自由运行,即在断点发生时继续操作 /* 非FREE自由行为:当I2C模块为CONTROLLER时:如果SCL在断点发生时为低,I2C模块立即停止并保持驱动SCL低,无论I2C模块是发送器还是接收器。如果SCL为高,I2C模块会等待SCL变低然后停止。当I2C模块为TARGET时:断点会强制I2C模块在当前传输/接收完成后停止。*///I2caRegs.I2CMDR.bit.NACKMOD // 仅在I2C模块作为接收器时适用 // 目标接收器或控制器接收器模式下,I2C模块在下一个确认周期中向发送器发送NACK位。一旦NACK位被发送,NACKMOD位会被清除。// 若要在下一个确认周期中发送NACK位,必须在最后一个数据位的上升沿之前设置NACKMOD位。I2caRegs.I2CMDR.bit.RM = 0; // 0:非重复模式 1:重复模式/*非重复模式:数据计数值寄存器(I2CCNT)决定I2C模块接收或传输的字节数。重复模式 :每次向I2CDXR寄存器写入时都会传输一个数据字节(或在FIFO模式下,直到传输FIFO为空),直到STP位被手动设置。此时I2CCNT的值被忽略。*/I2caRegs.I2CMDR.bit.STB = 0; // 0:I2C模块不在START字节模式 1:I2C模块在START字节模式/** 当设置START条件位(STT)时,I2C模块不仅仅生成一个START条件,还会生成:一个START条件 / 一个START字节(0000 0001b)/ 一个虚拟的应答时钟脉冲 /一个重复的START条件然后,I2C模块正常发送在I2CTAR中的目标地址。*/// I2C模块在I2CSTR[SCD]位设置后才清除该位。为避免干扰I2C状态机,用户必须等待该 STP 位清除后再发起新消息。I2caRegs.I2CMDR.bit.STP = 0; // 0:STP在停止条件生成后自动清除 1:STP由设备设置以在I2C模块内部数据计数器减到0时生成停止条件。// STT 启动条件位,仅在I2C模块为控制器时适用// I2caRegs.I2CMDR.bit.STT = 1; // 0:STT在启动条件生成后会自动清除 1: 导致I2C模块在I2C总线上生成启动条件//I2caRegs.I2CMDR.bit.TRX = 1; // 0:接收模式。此时 I2C 模块为接收器,并在SDA 引脚上接收数据。 1:发射模式//I2caRegs.I2CMDR.bit.XA
I2CCNT 寄存器配置:
数据计数值:I2CCNT表示要传输或接收的数据字节数。
// I2caRegs.I2CCNT // 表示要传输或接收的数据字节数 如果指定了STOP条件(STP=1),则在每个字节发送后,I2CCNT将递减,直到达到零,此时将生成STOP条件。// Oh (RW) = 数据计数值为65536 / 1h (RW) = 数据计数值为1 / 2h (RW) = 数据计数值为2 / FFFFh (R/W) = 数据计数值为65535
I2CDRR 和 I2CDXR寄存器配置:
一个接收数据寄存器 一个发送数据寄存器
//I2caRegs.I2CDRR.bit.DATA // [只读] I2C 接收的数据 bit//I2caRegs.I2CDXR.bit.DATA // I2C 传输的数据 bit
I2CEMDR 寄存器配置:
3220页:
//I2caRegs.I2CEMDR.bit.BC = 0 ; // BC 影响在目标发射机模式下,I2CSTR寄存器中传输状态位(XRDY和XSMT)的计时I2caRegs.I2CEMDR.bit.ECS = 0; // 0:禁用扩展自动时钟拉伸功能。 1:启用扩展自动时钟拉伸功能。启用后,当I2C目标在每次ACK/NACK周期后自动拉伸时钟。I2caRegs.I2CEMDR.bit.FCM = 0; // 前向兼容模式。此位编程后,仅在Tx数据请求时启用Tx请求功能,而不管Tx缓冲区的数据状态如何,适用于非FIFO模式。// 此FCM 寄存器会影响XRDY行为,因此需要在释放IRS(I2CMDR[5])后设置。I2caRegs.I2CEMDR.bit.MCS = 0; // 0:禁用手动时钟拉伸,SCL线被拉高。 1:启用手动时钟拉伸,SCL线被拉低,允许软件控制时钟拉伸。//当SCLKEY不是0xA时,手动时钟拉伸模式将保持禁用。I2caRegs.I2CEMDR.bit.NACK_CM = 0; // 0: 当NACK在控制器传输模式(Controller Transmitter mode)中被接收时,NACK位和NACK中断会被触发。// 1: 当NACK在控制器传输模式和目标传输模式(Target Transmitter mode)中都被接收时,NACK位和NACK中断会被触发。I2caRegs.I2CEMDR.bit.SCLKEY = 0; //初始值为0h。当需要启用扩展自动/手动模式下的时钟(SCL)拉伸功能时,需要写入0xA这个键值。// 如果SCLKEY 写入其他值,则无法启用扩展自动/手动模式下的时钟拉伸功能
I2CFFRX 寄存器配置:
3225页:
//I2caRegs.I2CFFRX.bit.RXFFIENA = 1; // 接收FIFO中断使能位。0:RXFFINT标志位设置时不会生成中断。 1:RXFFINT标志位设置时会生成中断。//I2caRegs.I2CFFRX.bit.RXFFIL = // 管理接收FIFO的中断级别//I2caRegs.I2CFFRX.bit.RXFFINT // [只读] 0:接收FIFO中断条件未发生 1:接收FIFO中断条件已发生。 //I2caRegs.I2CFFRX.bit.RXFFINTCLR = 1; // 0:写入零没有效果,读取返回零。 写入1可以清除RXFFINT标志。I2caRegs.I2CFFRX.bit.RXFFRST = 1; // 复位//I2caRegs.I2CFFRX.bit.RXFFST // [只读] “xxxxx”表示接收FIFO包含xxxxx字节的数据。 “00000”表示接收FIFO为空。
I2CFFTX 寄存器配置:
手册3224
I2caRegs.I2CFFTX.bit.I2CFFEN = 1; //使能 0: 禁用FIFO 1:启用FIFO//I2caRegs.I2CFFTX.bit.TXFFIENA // 0:TXFFINT标志位被禁用,即使被设置也不会产生中断。 1:TXFFINT标志位被启用,一旦设置就会产生中断。//I2caRegs.I2CFFTX.bit.TXFFIL // 设置发送中断标志的状态级别//当TXFFST4-0位达到等于或小于这些位值时,TXFFINT标志将被设置。如果TXFFIENA位被设置将产生一个中断。由于I2C具有16级发送FIFO,这些位不能配置为超过16级FIFO的中断。//I2caRegs.I2CFFTX.bit.TXFFINT // [只读] 0: 表示传输FIFO中断条件尚未发生。 1:表示传输FIFO中断条件已经发生。//I2caRegs.I2CFFTX.bit.TXFFINTCLR // 写0无效 写1 传输FIFO中断标志清除I2caRegs.I2CFFTX.bit.TXFFRST = 1; //复位//I2caRegs.I2CFFTX.bit.TXFFST // [只读] 传输FIFO状态 xxxxx:表示传输FIFO中包含xxxxx字节。 / 00000:表示传输FIFO为空
I2CIER 寄存器配置:
3205页:
//I2caRegs.I2CIER.bit.AAT = 1; // 目标中断使能(TARGET interrupt enable) 0:表示中断请求被禁用。 1:表示中断请求被启用。//I2caRegs.I2CIER.bit.ARBL = 1; // 仲裁丢失中断使能 0:表示中断请求禁用 1:表示中断请求启用。//I2caRegs.I2CIER.bit.ARDY = 1; // 使能寄存器访问就绪中断 0:表示中断请求禁用 1:表示中断请求启用。//I2caRegs.I2CIER.bit.NACK = 1; // 无确认中断使能 0:表示中断请求禁用 1:表示中断请求启用。//I2caRegs.I2CIER.bit.RRDY = 1; // 接收数据准备好中断使能位 0:表示中断请求禁用 1:表示中断请求启用。//I2caRegs.I2CIER.bit.SCD = 1; // 停止条件检测中断使能(Stop condition detected interrupt enable) 0:表示中断请求禁用 1:表示中断请求启用。//I2caRegs.I2CIER.bit.SCL_ECS = 1; // SCL扩展自动时钟拉伸中断使能 0:表示中断请求禁用 1:表示中断请求启用。//I2caRegs.I2CIER.bit.XRDY = 1; // 传输数据就绪中断 0:表示中断请求禁用 1:表示中断请求启用。
I2CISRC 寄存器配置:
3220
//I2caRegs.I2CISRC.bit.INTCODE // [只读] 指示产生I2C中断的事件/** Oh (RW) = 无 5h (RW) = 发送数据准备好1h (RW) = 仲裁丢失 6h (RW) = 停止条件检测到2h (RW) = 未确认条件检测到 7h (RW) = 被寻址为TARGET3h (RW) = 寄存器准备好被访问 8h (RW) = 扩展自动时钟拉伸4h (RW) = 接收数据准备好* *///I2caRegs.I2CISRC.bit.WRITE_ZEROS // 这些保留的比特位应始终写为零
I2COAR 寄存器配置:
I2CSTR 寄存器配置:
3205:
//I2caRegs.I2CSTR.bit.AAT // [只读] 1:I2C模块已识别其自身的目标地址或所有零地址(通用呼叫) /*在7位寻址模式下,接收到NACK、STOP条件或重复的START条件时,AAT位被清除。在10位寻址模式下,接收到NACK、STOP条件或通过不同于I2C外设自身目标地址的目标地址时,AAT位被清除。*///I2caRegs.I2CSTR.bit.AD0 // [只读] 0:表示ADO已被启动或停止条件清除。 1:表示检测到全零地址(通用呼叫)。//I2caRegs.I2CSTR.bit.ARBL // [只读] 仲裁丢失中断标志位,仅在I2C模块作为控制器-发送器时适用。//I2caRegs.I2CSTR.bit.ARDY // [写1清零] 寄存器访问就绪中断标志位,仅在I2C模块处于控制器模式时适用。当ARDY置位时,表示I2C模块寄存器已准备好被访问/*在非重复模式(RM=0在I2CMDR中):如果STP=0,当内部数据计数器减到0时,ARDY位被置位;如果STP=1,ARDY不受影响,I2C模块在计数器达到0时生成STOP条件。在重复模式(RM=1):每个字节从I2CDXR传输结束时,ARDY被置位。手动清零ARDY,通过向该位写1实现。*///I2caRegs.I2CSTR.bit.BB // [只读] 表示I2C总线是否忙碌或可用于另一个数据传输 Oh:表示总线空闲。 1h:表示总线忙碌。//I2caRegs.I2CSTR.bit.BYTESENT // [可读 / 写1清零] 0:I2C模块尚未完成传输下一个数据字节。 1:I2C模块已完成一个字节的传输。//I2caRegs.I2CSTR.bit.NACK // [可读 / 写1清零] 无确认中断标志位。O:该位的状态表示ACK接收/NACK未接收。1:硬件检测到无确认(NACK)位已被接收。//NACK指示I2C模块是否检测到确认位(ACK)或无确认位(NACK)。//I2caRegs.I2CSTR.bit.NACKSNT // [可读 / 写1清零] 0:NACK未发送 //I2caRegs.I2CSTR.bit.RRDY // [可读 / 写1清零] 1 :I2CDRR已准备好,表示数据已从I2CRSR复制到I2CDRR。//当I2C模块不在FIFO模式时,RRDY表示数据接收寄存器(I2CDRR)已经准备好读取,因为数据已从接收移位寄存器(I2CRSR)复制到I2CDRR。//I2caRegs.I2CSTR.bit.RSFULL // [只读] 检测到没有溢出时,RAW位为0; 当检测到溢出时,RAW位为1。//RSFULL用于指示接收过程中发生的溢出条件。当新的数据被接收进移位寄存器(I2CRSR),而旧数据尚未从接收寄存器(I2CDRR)读取时,就会发生溢出。//I2caRegs.I2CSTR.bit.SCD // [可读 / 写1清零] 停止条件检测位 1:表示I2C总线上已检测到停止条件。//I2caRegs.I2CSTR.bit.SCL_ECS // [可读 / 写1清零] 0:当该位为0时,SCL线被拉高。 1:在ACK或NACK阶段后,SCL线被拉低。在扩展自动时钟拉伸模式下,SCL线被拉低。 //I2caRegs.I2CSTR.bit.TDIR // [可读 / 写1清零] 目标方向位 0:I2C不被视为目标发射器 1:I2C被视为目标发射器。//I2caRegs.I2CSTR.bit.XRDY // [只读] 传输数据准备中断标志位 0:表示之前的数据已从I2CDXR复制到传输移位寄存器(I2CXSR) 1:XRDY仅在需要下一数据时置位,并在写入I2CDXR时清除//I2caRegs.I2CSTR.bit.XSMT // [只读] 0:检测到下溢(为空) 1: 未检测到下溢(不为空)//下溢发生在发射移位寄存器(I2CXSR)为空,但数据发射寄存器(I2CDXR)自上次I2CDXR-to-I2CXSR传输以来未加载时。
I2CTAR 寄存器配置:
I2caRegs.I2CTAR.all=0x0050;/*在7位寻址模式(I2CMDR中的XA = 0)下:00h-7Fh位的6-0位提供I2C模块在控制器传输模式时发送的7位目标地址。将位9-7写为0。在10位寻址模式(I2CMDR中的XA = 1)下:000h-3FFh位的9-0位提供I2C模块在控制器传输模式时发送的10位目标地址。重置类型为SYSRSn。*/
整体寄存器相关代码配置:
// 初始化I2Ca / SYSTICK 150MHz / I2CCLK 400 k / void Init_I2CA(void) {EALLOW;PieVectTable.I2CA_INT = &I2Ca_ISr; // 链接 中断服务函数的 函数名称地址EDIS;//这里 IRS 先置0 释放总线,后续全部配置完毕 再置1 启用I2C模块I2caRegs.I2CMDR.bit.IRS = 0; // 0: I2C模块处于重置/禁用状态。当该位清除到0时,所有状态位(在I2CSTR中)都设置为其默认值。 1:I2C模块被启用。I2caRegs.I2CTAR.all=0x0050;/*在7位寻址模式(I2CMDR中的XA = 0)下:00h-7Fh位的6-0位提供I2C模块在控制器传输模式时发送的7位目标地址。将位9-7写为0。在10位寻址模式(I2CMDR中的XA = 1)下:000h-3FFh位的9-0位提供I2C模块在控制器传输模式时发送的10位目标地址。重置类型为SYSRSn。*//*I2caRegs.I2CMDR.bit.BC = 0; // 定义数据字节中的比特数(1到8)0:8bit 1~7: 1~7 bitI2caRegs.I2CMDR.bit.CNT = 1; // 0:TARGET模式:I2C模块从控制器接收串行时钟 1:CONTROLLER模式:I2C模块作为控制器,在SCL引脚上生成串行时钟I2caRegs.I2CMDR.bit.DLB = 0; // 0:关闭数字回环模式 1:开启// 数字环回模式 DLB 下,从I2CDXR接收的数据会在n个设备周期之后,通过内部路径传输到I2CDRR。其中n = ((I2C输入时钟频率/模块时钟频率) x 8)。I2caRegs.I2CMDR.bit.FDF = 0; // 0:禁用自由数据格式模式,传输使用由XA位选择的7-/10-bit寻址格式 1:启用自由数据格式模式,传输使用自由数据(无地址)格式,//但此 FDF 格式在数字回环模式(DLB=1)下不受支持。I2caRegs.I2CMDR.bit.FREE = 1; // O:执行非FREE自由行为 1:I2C模块自由运行,即在断点发生时继续操作*//* 非FREE自由行为:当I2C模块为CONTROLLER时:如果SCL在断点发生时为低,I2C模块立即停止并保持驱动SCL低,无论I2C模块是发送器还是接收器。如果SCL为高,I2C模块会等待SCL变低然后停止。当I2C模块为TARGET时:断点会强制I2C模块在当前传输/接收完成后停止。*///I2caRegs.I2CMDR.bit.NACKMOD // 仅在I2C模块作为接收器时适用// 目标接收器或控制器接收器模式下,I2C模块在下一个确认周期中向发送器发送NACK位。一旦NACK位被发送,NACKMOD位会被清除。// 若要在下一个确认周期中发送NACK位,必须在最后一个数据位的上升沿之前设置NACKMOD位。//I2caRegs.I2CMDR.bit.RM = 0; // 0:非重复模式 1:重复模式/*非重复模式:数据计数值寄存器(I2CCNT)决定I2C模块接收或传输的字节数。重复模式 :每次向I2CDXR寄存器写入时都会传输一个数据字节(或在FIFO模式下,直到传输FIFO为空),直到STP位被手动设置。此时I2CCNT的值被忽略。*///I2caRegs.I2CMDR.bit.STB = 0; // 0:I2C模块不在START字节模式 1:I2C模块在START字节模式/** 当设置START条件位(STT)时,I2C模块不仅仅生成一个START条件,还会生成:一个START条件 / 一个START字节(0000 0001b)/ 一个虚拟的应答时钟脉冲 /一个重复的START条件然后,I2C模块正常发送在I2CTAR中的目标地址。*/// I2C模块在I2CSTR[SCD]位设置后才清除该位。为避免干扰I2C状态机,用户必须等待该 STP 位清除后再发起新消息。//I2caRegs.I2CMDR.bit.STP = 0; // 0:STP在停止条件生成后自动清除 1:STP由设备设置以在I2C模块内部数据计数器减到0时生成停止条件。// STT 启动条件位,仅在I2C模块为控制器时适用//I2caRegs.I2CMDR.bit.STT = 1; // 0:STT在启动条件生成后会自动清除 1: 导致I2C模块在I2C总线上生成启动条件//I2caRegs.I2CMDR.bit.TRX = 1; // 0:接收模式。此时 I2C 模块为接收器,并在SDA 引脚上接收数据。 1:发射模式//I2caRegs.I2CMDR.bit.XA// SYSTICK 150MHz ---> IIC 10Mhz// 150MHz / (14 + 1 ) = 10MhzI2caRegs.I2CPSC.all=14; // PSC > 1 d = 5// 设定I2C 时钟线频率 10MHz / (10 + d) + (5 + d) = 400 kI2caRegs.I2CCLKH=5;I2caRegs.I2CCLKL=10;I2caRegs.I2CCNT = I2C_NUMBYTES; // 表示要传输或接收的数据字节数 如果指定了STOP条件(STP=1),则在每个字节发送后,I2CCNT将递减,直到达到零,此时将生成STOP条件。// Oh (RW) = 数据计数值为65536 / 1h (RW) = 数据计数值为1 / 2h (RW) = 数据计数值为2 / FFFFh (R/W) = 数据计数值为65535//I2caRegs.I2CDRR.bit.DATA // [只读] I2C 接收的数据 bit//I2caRegs.I2CDXR.bit.DATA // I2C 传输的数据 bit//I2caRegs.I2CEMDR.bit.BC = 0 ; // BC 影响在目标发射机模式下,I2CSTR寄存器中传输状态位(XRDY和XSMT)的计时I2caRegs.I2CEMDR.bit.ECS = 0; // 0:禁用扩展自动时钟拉伸功能。 1:启用扩展自动时钟拉伸功能。启用后,当I2C目标在每次ACK/NACK周期后自动拉伸时钟。I2caRegs.I2CEMDR.bit.FCM = 0; // 前向兼容模式。此位编程后,仅在Tx数据请求时启用Tx请求功能,而不管Tx缓冲区的数据状态如何,适用于非FIFO模式。// 此FCM 寄存器会影响XRDY行为,因此需要在释放IRS(I2CMDR[5])后设置。I2caRegs.I2CEMDR.bit.MCS = 0; // 0:禁用手动时钟拉伸,SCL线被拉高。 1:启用手动时钟拉伸,SCL线被拉低,允许软件控制时钟拉伸。//当SCLKEY不是0xA时,手动时钟拉伸模式将保持禁用。I2caRegs.I2CEMDR.bit.NACK_CM = 0; // 0: 当NACK在控制器传输模式(Controller Transmitter mode)中被接收时,NACK位和NACK中断会被触发。// 1: 当NACK在控制器传输模式和目标传输模式(Target Transmitter mode)中都被接收时,NACK位和NACK中断会被触发。I2caRegs.I2CEMDR.bit.SCLKEY = 0; //初始值为0h。当需要启用扩展自动/手动模式下的时钟(SCL)拉伸功能时,需要写入0xA这个键值。// 如果SCLKEY 写入其他值,则无法启用扩展自动/手动模式下的时钟拉伸功能//I2caRegs.I2CFFRX.bit.RXFFIENA = 1; // 接收FIFO中断使能位。0:RXFFINT标志位设置时不会生成中断。 1:RXFFINT标志位设置时会生成中断。//I2caRegs.I2CFFRX.bit.RXFFIL = // 管理接收FIFO的中断级别//I2caRegs.I2CFFRX.bit.RXFFINT // [只读] 0:接收FIFO中断条件未发生 1:接收FIFO中断条件已发生。I2caRegs.I2CFFRX.bit.RXFFINTCLR = 1; // 0:写入零没有效果,读取返回零。 写入1可以清除RXFFINT标志。I2caRegs.I2CFFRX.bit.RXFFRST = 1; // 复位//I2caRegs.I2CFFRX.bit.RXFFST // [只读] “xxxxx”表示接收FIFO包含xxxxx字节的数据。 “00000”表示接收FIFO为空。I2caRegs.I2CFFTX.bit.I2CFFEN = 1; //使能 0: 禁用FIFO 1:启用FIFO//I2caRegs.I2CFFTX.bit.TXFFIENA // 0:TXFFINT标志位被禁用,即使被设置也不会产生中断。 1:TXFFINT标志位被启用,一旦设置就会产生中断。//I2caRegs.I2CFFTX.bit.TXFFIL // 设置发送中断标志的状态级别//当TXFFST4-0位达到等于或小于这些位值时,TXFFINT标志将被设置。如果TXFFIENA位被设置将产生一个中断。由于I2C具有16级发送FIFO,这些位不能配置为超过16级FIFO的中断。//I2caRegs.I2CFFTX.bit.TXFFINT // [只读] 0: 表示传输FIFO中断条件尚未发生。 1:表示传输FIFO中断条件已经发生。//I2caRegs.I2CFFTX.bit.TXFFINTCLR // 写0无效 写1 传输FIFO中断标志清除I2caRegs.I2CFFTX.bit.TXFFRST = 1; //复位//I2caRegs.I2CFFTX.bit.TXFFST // [只读] 传输FIFO状态 xxxxx:表示传输FIFO中包含xxxxx字节。 / 00000:表示传输FIFO为空//I2caRegs.I2CIER.bit.AAT = 1; // 目标中断使能(TARGET interrupt enable) 0:表示中断请求被禁用。 1:表示中断请求被启用。//I2caRegs.I2CIER.bit.ARBL = 1; // 仲裁丢失中断使能 0:表示中断请求禁用 1:表示中断请求启用。I2caRegs.I2CIER.bit.ARDY = 1; // 使能寄存器访问就绪中断 0:表示中断请求禁用 1:表示中断请求启用。//I2caRegs.I2CIER.bit.NACK = 1; // 无确认中断使能 0:表示中断请求禁用 1:表示中断请求启用。//I2caRegs.I2CIER.bit.RRDY = 1; // 接收数据准备好中断使能位 0:表示中断请求禁用 1:表示中断请求启用。I2caRegs.I2CIER.bit.SCD = 1; // 停止条件检测中断使能(Stop condition detected interrupt enable) 0:表示中断请求禁用 1:表示中断请求启用。//I2caRegs.I2CIER.bit.SCL_ECS = 1; // SCL扩展自动时钟拉伸中断使能 0:表示中断请求禁用 1:表示中断请求启用。//I2caRegs.I2CIER.bit.XRDY = 1; // 传输数据就绪中断 0:表示中断请求禁用 1:表示中断请求启用。//I2caRegs.I2CISRC.bit.INTCODE // [只读] 指示产生I2C中断的事件/** Oh (RW) = 无 5h (RW) = 发送数据准备好1h (RW) = 仲裁丢失 6h (RW) = 停止条件检测到2h (RW) = 未确认条件检测到 7h (RW) = 被寻址为TARGET3h (RW) = 寄存器准备好被访问 8h (RW) = 扩展自动时钟拉伸4h (RW) = 接收数据准备好* *///I2caRegs.I2CISRC.bit.WRITE_ZEROS // 这些保留的比特位应始终写为零I2caRegs.I2COAR.all = I2C_OWN_ADDRESS;/*在7位寻址模式(XA = 0 在I2CMDR)下:00h-7Fh位的6-0位提供I2C模块的7位目标地址。9-7位写0。在10位寻址模式(XA = 1 在I2CMDR)下:000h-3FFh位的9-0位提供I2C模块的10位目标地址。* *///I2caRegs.I2CSTR.bit.AAT // [只读] 1:I2C模块已识别其自身的目标地址或所有零地址(通用呼叫)/*在7位寻址模式下,接收到NACK、STOP条件或重复的START条件时,AAT位被清除。在10位寻址模式下,接收到NACK、STOP条件或通过不同于I2C外设自身目标地址的目标地址时,AAT位被清除。*///I2caRegs.I2CSTR.bit.AD0 // [只读] 0:表示ADO已被启动或停止条件清除。 1:表示检测到全零地址(通用呼叫)。//I2caRegs.I2CSTR.bit.ARBL // [只读] 仲裁丢失中断标志位,仅在I2C模块作为控制器-发送器时适用。//I2caRegs.I2CSTR.bit.ARDY // [写1清零] 寄存器访问就绪中断标志位,仅在I2C模块处于控制器模式时适用。当ARDY置位时,表示I2C模块寄存器已准备好被访问/*在非重复模式(RM=0在I2CMDR中):如果STP=0,当内部数据计数器减到0时,ARDY位被置位;如果STP=1,ARDY不受影响,I2C模块在计数器达到0时生成STOP条件。在重复模式(RM=1):每个字节从I2CDXR传输结束时,ARDY被置位。手动清零ARDY,通过向该位写1实现。*///I2caRegs.I2CSTR.bit.BB // [只读] 表示I2C总线是否忙碌或可用于另一个数据传输 Oh:表示总线空闲。 1h:表示总线忙碌。//I2caRegs.I2CSTR.bit.BYTESENT // [可读 / 写1清零] 0:I2C模块尚未完成传输下一个数据字节。 1:I2C模块已完成一个字节的传输。//I2caRegs.I2CSTR.bit.NACK // [可读 / 写1清零] 无确认中断标志位。O:该位的状态表示ACK接收/NACK未接收。1:硬件检测到无确认(NACK)位已被接收。//NACK指示I2C模块是否检测到确认位(ACK)或无确认位(NACK)。//I2caRegs.I2CSTR.bit.NACKSNT // [可读 / 写1清零] 0:NACK未发送//I2caRegs.I2CSTR.bit.RRDY // [可读 / 写1清零] 1 :I2CDRR已准备好,表示数据已从I2CRSR复制到I2CDRR。//当I2C模块不在FIFO模式时,RRDY表示数据接收寄存器(I2CDRR)已经准备好读取,因为数据已从接收移位寄存器(I2CRSR)复制到I2CDRR。//I2caRegs.I2CSTR.bit.RSFULL // [只读] 检测到没有溢出时,RAW位为0; 当检测到溢出时,RAW位为1。//RSFULL用于指示接收过程中发生的溢出条件。当新的数据被接收进移位寄存器(I2CRSR),而旧数据尚未从接收寄存器(I2CDRR)读取时,就会发生溢出。//I2caRegs.I2CSTR.bit.SCD // [可读 / 写1清零] 停止条件检测位 1:表示I2C总线上已检测到停止条件。//I2caRegs.I2CSTR.bit.SCL_ECS // [可读 / 写1清零] 0:当该位为0时,SCL线被拉高。 1:在ACK或NACK阶段后,SCL线被拉低。在扩展自动时钟拉伸模式下,SCL线被拉低。//I2caRegs.I2CSTR.bit.TDIR // [可读 / 写1清零] 目标方向位 0:I2C不被视为目标发射器 1:I2C被视为目标发射器。//I2caRegs.I2CSTR.bit.XRDY // [只读] 传输数据准备中断标志位 0:表示之前的数据已从I2CDXR复制到传输移位寄存器(I2CXSR) 1:XRDY仅在需要下一数据时置位,并在写入I2CDXR时清除//I2caRegs.I2CSTR.bit.XSMT // [只读] 0:检测到下溢(为空) 1: 未检测到下溢(不为空)//下溢发生在发射移位寄存器(I2CXSR)为空,但数据发射寄存器(I2CDXR)自上次I2CDXR-to-I2CXSR传输以来未加载时。I2caRegs.I2CMDR.bit.IRS = 1; //启用I2CPieCtrlRegs.PIEIER8.bit.INTx1 = 1; //I2C 中断使能 ,PIE Group 8IER |= M_INT8;//初始化 引脚GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3;GpioCtrlRegs.GPAGMUX2.bit.GPIO26 = 2;GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 3;GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0;GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3;GpioCtrlRegs.GPAGMUX2.bit.GPIO27 = 2;GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 3;}
I2C中断服务函数:
这个中断服务函数的存在目前只是为了不卡系统,但也不完整,别抄!:
测试效果图:
由于我没有IIC的从器件,所以测试效果没有任何参考性,原因如下:
1.官方例程测试效果与图中一致
2.我的程序测试效果与图中一致
3.与IIC无关程序测试效果与图中也是一致
完整工程下载:
本文不提供完整工程下载,可能会误人子弟
相关文章:
TMS320F28P550SJ9学习笔记8:I2C通信的结构体寄存器配置的了解
继续学习IIC通信的寄存器配置方式:尝试使用寄存器方式配置了解I2C a 没条件完整测试IIC功能,具体的修改与测试留在下文,这里只贴出全部代码,就不提供工程了 文章提供测试代码讲解、完整工程下载、测试效果图 目录 IIC通信引脚&a…...
TypeScript类:面向对象编程的基石
一、从现实世界到代码世界 想象你要建造一栋房子,首先需要一张设计蓝图——它定义了房屋的结构(几个房间)、功能(卧室/厨房)和特性(材料/颜色)。在TypeScript中,class就是这个设计蓝…...
C语言学习笔记-进阶(10)自定义类型:结构体
1. 结构体类型的声明 前面我们在学习操作符的时候,已经学习了结构体的知识,这里稍微复习一下。 1.1 结构体回顾 结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.1 结构体的声明 struct tag {member-…...
Java 大视界 -- Java 大数据在智能家居能源管理与节能优化中的应用(120)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
upload-labs-master通关攻略(9~12)
Pass-9 建立1.php <?php phpinfo();?> 上传时抓包 修改代码 在1.php后面加点号空格点号 放行后得到 Pass-10 将1.php放入 上传时抓包 修改代码 将1.php改为1.pphphp 上传后得到 Pass-11 将1.php改为1.png 上传时抓包 修改代码 ../upload/2.php%00 放行后得到 Pass…...
python语言总结(持续更新)
本文主要是总结各函数,简单的函数不会给予示例,如果在平日遇到一些新类型将会添加 基础知识 输入与输出 print([要输出的内容])输出函数 input([提示内容]如果输入提示内容会在交互界面显示,用以提示用户)输入函数 注释 # 单行注释符&…...
UI自动化测试 —— web端元素获取元素等待实践!
前言 Web UI自动化测试是一种软件测试方法,通过模拟用户行为,自动执行Web界面的各种操作,并验证操作结果是否符合预期,从而提高测试效率和准确性。 目的: 确保Web应用程序的界面在不同环境(如不同浏览器、操作系统)下…...
【CXX】6.6 UniquePtr<T> — std::unique_ptr<T>
std::unique_ptr 的 Rust 绑定称为 UniquePtr。有关 Rust API 的文档,请参见链接。 限制: 目前仅支持 std::unique_ptr<T, std::default_delete>。未来可能会支持自定义删除器。 UniquePtr 不支持 T 为不透明的 Rust 类型。对于在语言边界传递不…...
【网络协议安全】任务10:三层交换机配置
CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog三层交换机是指在OSI(开放系统互连)模型中的第三层网络层提供路由功能的交换机。它不仅具备二层交换机的交换功能,还能实现路由功能,提供更为灵活的网…...
C语言每日一练——day_4
引言 针对初学者,每日练习几个题,快速上手C语言。第四天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
文件系统调用(上) ─── linux第17课
目录 linux 中man 2和man 3的区别 文件内容介绍 C语言文件接口 示例: 输出信息到显示器,你有哪些方法 总结: 系统文件I/O 文件类的系统调用接口介绍 示例 open 函数具体使用哪个,和具体应用场景相关, write read close lseek ,类比C文件相关接…...
在 Spring Boot 中实现基于 TraceId 的日志链路追踪
1 前言 1.1 什么是 TraceId? TraceId 是一个唯一的标识符,用于跟踪分布式系统中的请求。每个请求从客户端发起到服务端处理,再到可能的多个微服务调用,都会携带这个 TraceId,以便在整个请求链路中进行追踪和调试。 1.2 日志链路追踪的意义 日志链路追踪可以帮助开发者…...
STM32 HAL库 CAN过滤器配置
之前在STM32 f407 CAN收发 基于HAL库和Cubemx配置_stm32f407can收发程序-CSDN博客这篇博文里写了一下配置CAN收发的方法,当时由于并没有使用过滤器的现实需求,所以就也没仔细研究。现在工作中确实需要用到过滤器了,有些项目中控制器和发动机E…...
C++ 控制结构与函数全面解析
引言 在 C 编程中,控制结构和函数是构建程序逻辑的关键要素。控制结构能够决定程序的执行流程,而函数则可以将代码模块化,提高代码的复用性和可维护性。本文将深入介绍 C 中的控制结构和函数的相关知识。 一、控制结构 1. if - else 语句 …...
基于django+pytorch(Faster R-CNN)的钢材缺陷识别系统
一、训练数据来源以及数据标注 数据来源于阿里云天池实验室公开数据集中的铝型材缺陷检测数据集APDDD 数据标注通过labelme进行标注,图片所有标注以转化为矩形标注,存放成json格式。 二、模型训练方式及结果 缺陷识别模型基于Faster R-CNN ResNet5…...
C++多态
多态 多态分为:静态多态(函数重载,运算符重载)和动态多态(派生类、虚函数) 二者区别:静态多态是在地址编译时绑定,而动态多态是在地址运行时绑定 动态多态的特点: 1.有继承关系 2.子类重写父类虚函数(就是跟父类行为函数名称一样,但是是作为子类的行为) 动态多态的…...
【一句话经验】ubuntu vi/vim 模式自动设置为paste
从centos过来,发现ubutun有些地方不习惯,尤其是vi的粘贴,默认自动进去了代码模式,导致每次粘贴必须得set paste,否则会出现问题。 解决办法非常简单,按照下面命令执行即可: cd ~ echo "…...
MongoDB 触发器实现教程
在传统的关系型数据库(如 MySQL)中,触发器是一种强大的工具,它可以在特定的数据库操作(如插入、更新或删除)发生时自动执行一段代码。然而,MongoDB 并没有原生内置的触发器概念。不过࿰…...
ESP8266 NodeMCU 与 Atmega16 微控制器连接以发送电子邮件
NodeMCU ESP8266 AVR 微控制器 ATmega16 的接口 Atmega16 是一款低成本的 8 位微控制器,比以前版本的微控制器具有更多的 GPIO。它具有所有常用的通信协议,如 UART、USART、SPI 和 I2C。由于其广泛的社区支持和简单性,它在机器人、汽车和自动化行业有广泛的应用。 Atmega1…...
《算法笔记》8.1小节——搜索专题->深度优先搜索(DFS)问题 C: 【递归入门】组合+判断素数
题目描述 已知 n 个整数b1,b2,…,bn 以及一个整数 k(k<n)。 从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。 例如当 n4,k=3,4 个整数分别为 3,7,12…...
重生之我在学Vue--第8天 Vue 3 UI 框架(Element Plus)
重生之我在学Vue–第8天 Vue 3 UI 框架(Element Plus) 文章目录 重生之我在学Vue--第8天 Vue 3 UI 框架(Element Plus)前言一、Element Plus 基础:从安装到组件革命1.1 安装与两种引入模式全量引入(适合快速…...
从前端视角理解消息队列:核心问题与实战指南
消息队列(Message Queue)是现代分布式系统的核心组件之一,它在前后端协作、系统解耦、流量削峰等场景中发挥着重要作用。本文从前端开发者视角出发,解析消息队列的关键问题,并结合实际场景给出解决方案。 一、为什么要…...
Mysql配置文件My.cnf(my.ini)配置参数说明
一、my.cnf 配置文件路径:/etc/my.cnf,在调整了该文件内容后,需要重启mysql才可生效。 1、主要参数 basedir path # 使用给定目录作为根目录(安装目录)。 datadir path # 从给定目录读取数据库文件。 pid-file filename # 为mysq…...
Docker 安装成功后,安装 Dify 中文版本的步骤
Docker 安装成功后,安装 Dify 中文版本的步骤如下1: 克隆 Dify 代码仓库:在终端中执行以下命令,将 Dify 源代码克隆至本地环境。 bash git clone https://github.com/langgenius/dify.git进入 Dify 的 docker 目录: b…...
Spring(4)——响应相关
一、返回静态页面 1.1**RestController和Controller** 想返回如下页面: 如果我们依旧使用原来的**RestController** 可以看到的是仅仅返回了字符串。 此时将**RestController改为Controller** 可以看到这次返回的是html页面。 那么**RestController和Controller…...
LPDDR5x电源使用Si电容对PI和PSIJ影响分析
SoC可能包含许多高速接口,其中LPDDR5X目前因为高带宽、低功耗、大容量等性能优势开始逐渐在AI计算、5G通信、视频处理等领域开始使用。LPDDR5X目前的速率高达8.533 GT/s,以及多个为这些接口供电的IO电压轨,而这些IO轨的PDN需要提供低阻抗&…...
[网络爬虫] 动态网页抓取 — Selenium 介绍 环境配置
🌟想系统化学习爬虫技术?看看这个:[数据抓取] Python 网络爬虫 - 学习手册-CSDN博客 0x01:Selenium 工具介绍 Selenium 是一个开源的便携式自动化测试工具。它最初是为网站自动化测试而开发的,类似于我们玩游戏用的按…...
MySQL数据库操作
目录 SQL语句 1、SQL的背景 2、SQL的概念 SQL的分类 SQL的书写规范 MySQL数据库 1、MySQL数据库的编码 (1)utf8和utf8mb4的区别 (2)MySQL的字符集 (3)MySQL默认编码为 latin1 ,如何更改…...
java之uniapp实现门店地图
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、后台实现1. 获取门店的经纬度2.api查询对应的sql 二 、小程序实现 前言 实现查询门店地址的功能,可以按照距离排序。使用技术:java…...
Git基本概念及使用
目录 一、git安装 二、git仓库基本概念 1. 远程仓库(Remote): 2. 本地库(Repository): 3. 分支(Branch): 4.本地库和远程库的关系 三、git仓库的工作流程 四、gi…...
游戏引擎学习第147天
仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾 具体来说,我们通过隐式计算来解决问题,而不是像数字微分分析器那样逐步增加数据。我们已经涵盖了这个部分,并计划继续处理音量问题。不过,实际上我们现在不需要继续处理…...
docker私有仓库配置
基于 harbor 构建docker私有仓库 1、机器准备 os:openEuler 、rockylinux mem:4G disk:100G 2、关闭防火墙、禁用SELinux 3、安装docker和docker-compose yum install docker-ce -y配置加速 vim /etc/docker/d…...
PostgreSQL 18新特性之虚拟生成列
PostgreSQL 12 提供了生成列(GENERATED ALWAYS AS STORED)功能,但是只能支持存储型的生成列,需要占用存储空间,更新成本高。 为此,PostgreSQL 18 即将引入一个新的增强:虚拟生成列。这种类型的…...
燃气对我们生活的重要性体现在哪里?
燃气在我们的生活中有 多方面的重要性 ,以下是燃气对我们生活的重要性的详细说明: 烹饪和热水供应 : 燃气是家庭烹饪的主要能源,能够快速、高效地加热食物,使家庭聚餐更加便捷和愉快。 燃气热水器能够在短时间内提供…...
简易分析 uni.chooseImage 拍照上传的基本知识点(附Demo)
目录 前言1. 基本知识2. Demo 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本的介绍也可看官网:uni.chooseImage(options) 以下知识点主要用于学习了解,从实战中出发 1. 基本知识…...
私域流量时代的创新实践:以定制开发开源AI智能名片与S2B2C商城小程序源码为例的深度研究
摘要:在数字化转型的浪潮中,私域流量已成为企业获取用户、增强品牌影响力及实现销售转化的关键路径。本文首先概述了私域流量的概念及其重要性,随后通过分析故宫文创、B站跨年晚会及美妆品牌“完美日记”的成功案例,深入探讨了私域…...
preloaded-classes裁剪
系统预加载了哪些class类?system/etc/preloaded-classes 修改源代码? frameworks\base\config\preloaded-classes 默认位置,如果改了不生效,可能有其它模块的mk文件指定了preloaded-classes覆盖了framework模块,例如…...
JavaScript性能优化实战
在 JavaScript 开发中,性能优化是一个至关重要的方面,它可以提升应用的响应速度、减少资源消耗,从而提供更好的用户体验。以下是从多个方面进行 JavaScript 性能优化的详细实战内容: 1. 代码加载优化 1.1 异步加载脚本 使用 as…...
文件和异常
从文件中读取数据 读取整个文件 读取整个文件 要读取文件,需要一个包含几行文本的文件。下面首先创建一个文件,它包含精确 到小数点后30位的圆周率值,且在小数点后每10位处换行: pi_digits.txt 3.14159265358979323846264338…...
【AI大模型】LLM训练deepseek如何识别视频
要让像DeepSeek这样的大语言模型(LLM)具备视频识别能力,需要结合多模态学习技术,将视觉信息与文本语义进行融合。以下是实现这一目标的关键步骤和技术要点: --- 一、视频识别的核心挑战 1. 多模态数据:视频…...
【机械视觉】C#+VisionPro联合编程———【五、硬币检测小项目实现(C#+VisionPro联合编程和csv文件格式操作)】
【机械视觉】C#VisionPro联合编程———【五、硬币检测小项目实现(C#VisionPro联合编程和csv文件格式操作)】 项目介绍 总共有十二张检测的图片,当点击检测按钮时检测当前展示的图片并且将检测效果展示在表格中,当点击上一页或下一页时换检测图片&…...
空间域与频域图像处理
第一部分:空间域图像处理(Part 1) 1. 点操作(Pixel-wise Operations) 定义:仅基于单个像素的灰度值进行变换,不依赖邻域信息。 常见操作: 2. 邻域操作(Neighborhood O…...
使用DeepSeek+蓝耘快速设计网页简易版《我的世界》小游戏
前言:如今,借助先进的人工智能模型与便捷的云平台,即便是新手开发者,也能开启创意游戏的设计之旅。DeepSeek 作为前沿的人工智能模型,具备强大的功能与潜力,而蓝耘智算云平台则为其提供了稳定高效的运行环境…...
使用 React 和 Ant Design 处理 Excel 和 CSV 文件
在现代 Web 开发中,文件上传和解析是常见的需求。本文将介绍如何使用 React 和 Ant Design 库来处理 Excel 和 CSV 文件的上传,并将提取的表头信息展示在表格中。 1. 项目基础 确保你已经创建了一个 React 项目,并安装了必要的依赖。可以使…...
js 使用 Web Workers 来实现一个精确的倒计时,即使ios手机锁屏或页面进入后台,倒计时也不会暂停。
## 效果如上 <!-- 将 main.js 和 worker.js 放在同一个目录下,然后在 HTML 文件中引入 main.js --><!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&q…...
Java中的常用关键字
目录 static关键字 (1)static修饰成员变量 (2)static修饰成员方法 super和this关键字 super关键字 示例1:使用super调用父类的构造器 示例2:使用super访问父类的方法 示例3:使用super访问…...
pytest数据库测试文章推荐
参考链接: 第一部分:http://alextechrants.blogspot.fi/2013/08/unit-testing-sqlalchemy-apps.html第二部分:http://alextechrants.blogspot.fi/2014/01/unit-testing-sqlalchemy-apps-part-2.html...
ubuntu20.04 使用linuxdeployqt打包一个QT程序
问题描述:ubuntu 打包一个QT程序 解决方法: 1.安装linuxdeployqt linuxdeployqt的github网址:linuxdeplyoqt 我下载好了,适合大家的直接拿,已经改好名字为linuxdeployqt 链接: https://pan.baidu.com/s/1r25aVwRAh-sx4ksadj6…...
⭐算法OJ⭐经典题目分类索引(持续更新)
在编程竞赛和算法学习中,Online Judge(OJ)平台是程序员们磨练技能的重要工具。OJ平台上的题目种类繁多,涵盖了从基础数据结构到复杂算法的各个方面。为了更好地理解和掌握这些题目,对其进行分类是非常有必要的。这篇索…...
Redis-缓存穿透击穿雪崩
1. 穿透问题 缓存穿透问题就是查询不存在的数据。在缓存穿透中,先查缓存,缓存没有数据,就会请求到数据库上,导致数据库压力剧增。 解决方法: 给不存在的key加上空值,防止每次都会请求到数据库。布隆过滤器…...