问答

汇集网友智慧,解决技术难题

21ic问答首页 - TAG - 从机
  • TMS320F280049使用SPI作为从机通讯和ADC采样冲突问题 sos 赏300家园币

    [align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]我想请教一下各位大佬,遇到了下面这个问题,恳请提供建议和帮助,谢谢!描述和问题如下:[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]1.使用了SPIA,作为从机,比特率为15M,FIFO的接收和发送的深度都为8,同步收发16位的200个数组元素的数组。[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]2.SPI启用了DMA的CH4(RX)、CH5(TX),都为循环模式,burst_size=8,transfer_size=25,都开启了循环模式。[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]3.ADC使用了EPWM的SOC触发采样,使用了三个ADC,ADC1,、ADC2、ADC3,分别采样128个数据。[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]4.ADC分别使用了CH1、CH2、CH3[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]5.问题现象:现在的工况是工作是开启ADC采样DMA发送完成触发中断后调用函数执行FFT以及触发CLA任务完成后再次开启采样,直道工作接收停止这个循环过程;SPI配置好和主机同步后就一直通过DMA循环接收,中间不停止不重启,现在是只要不启动工作,SPI的通讯收发是正常的,但是只要开启工作,ADC一直开始采样,SPI的接收FIFO就会溢出,清除标志位也一样很快溢出,调试看DMA的发送完成中断触发的时间变慢了,一溢出通讯就异常了,是因为DMA总线被ADC一直大量占用了吗,还是中断的优先级比其他的低导致SPI的中断和DMA的中断相应不及时导致的,试了降低比特率和FIFO的阈值都起不到效果, 恳请给出好的建议!!![/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]一下是程序的一些配置:[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]void ADC_init(){ //AD_PI initialization[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// ADC Initialization: Write ADC configurations and power up the ADC // Configures the ADC module's offset trim ADC_setOffsetTrimAll(ADC_REFERENCE_EXTERNAL,ADC_REFERENCE_3_3V); // Configures the analog-to-digital converter module prescaler. ADC_setPrescaler(AD_PI_BASE, ADC_CLK_DIV_2_0); // Sets the timing of the end-of-conversion pulse ADC_setInterruptPulseMode(AD_PI_BASE, ADC_PULSE_END_OF_CONV); // Powers up the analog-to-digital converter core. ADC_enableConverter(AD_PI_BASE); // Delay for 1ms to allow ADC time to power up DEVICE_DELAY_US(500);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// SOC Configuration: Setup ADC EPWM channel and trigger settings // Disables SOC burst mode. ADC_disableBurstMode(AD_PI_BASE); // Sets the priority mode of the SOCs. ADC_setSOCPriority(AD_PI_BASE, ADC_PRI_ALL_ROUND_ROBIN); // Start of Conversion 0 Configuration // Configures a start-of-conversion (SOC) in the ADC and its interrupt SOC trigger. // SOC number : 0 // Trigger : ADC_TRIGGER_EPWM3_SOCA // Channel : ADC_CH_ADCIN0 // Sample Window : 16 SYSCLK cycles // Interrupt Trigger: ADC_INT_SOC_TRIGGER_NONE ADC_setupSOC(AD_PI_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM3_SOCA, ADC_CH_ADCIN0, 16U); ADC_setInterruptSOCTrigger(AD_PI_BASE, ADC_SOC_NUMBER0, ADC_INT_SOC_TRIGGER_NONE); // ADC Interrupt 1 Configuration // SOC/EOC number : 0 // Interrupt Source: enabled // Continuous Mode : enabled ADC_setInterruptSource(AD_PI_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER0); ADC_enableInterrupt(AD_PI_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(AD_PI_BASE, ADC_INT_NUMBER1); ADC_enableContinuousMode(AD_PI_BASE, ADC_INT_NUMBER1);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]//AD_SI initialization[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// ADC Initialization: Write ADC configurations and power up the ADC // Configures the ADC module's offset trim ADC_setOffsetTrimAll(ADC_REFERENCE_EXTERNAL,ADC_REFERENCE_3_3V); // Configures the analog-to-digital converter module prescaler. ADC_setPrescaler(AD_SI_BASE, ADC_CLK_DIV_2_0); // Sets the timing of the end-of-conversion pulse ADC_setInterruptPulseMode(AD_SI_BASE, ADC_PULSE_END_OF_CONV); // Powers up the analog-to-digital converter core. ADC_enableConverter(AD_SI_BASE); // Delay for 1ms to allow ADC time to power up DEVICE_DELAY_US(500);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// SOC Configuration: Setup ADC EPWM channel and trigger settings // Disables SOC burst mode. ADC_disableBurstMode(AD_SI_BASE); // Sets the priority mode of the SOCs. ADC_setSOCPriority(AD_SI_BASE, ADC_PRI_ALL_ROUND_ROBIN); // Start of Conversion 0 Configuration // Configures a start-of-conversion (SOC) in the ADC and its interrupt SOC trigger. // SOC number : 0 // Trigger : ADC_TRIGGER_EPWM3_SOCA // Channel : ADC_CH_ADCIN4 // Sample Window : 16 SYSCLK cycles // Interrupt Trigger: ADC_INT_SOC_TRIGGER_NONE ADC_setupSOC(AD_SI_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM3_SOCA, ADC_CH_ADCIN4, 16U); ADC_setInterruptSOCTrigger(AD_SI_BASE, ADC_SOC_NUMBER0, ADC_INT_SOC_TRIGGER_NONE); // ADC Interrupt 1 Configuration // SOC/EOC number : 0 // Interrupt Source: enabled // Continuous Mode : enabled ADC_setInterruptSource(AD_SI_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER0); ADC_enableInterrupt(AD_SI_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(AD_SI_BASE, ADC_INT_NUMBER1); ADC_enableContinuousMode(AD_SI_BASE, ADC_INT_NUMBER1);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]//AD_SU initialization[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// ADC Initialization: Write ADC configurations and power up the ADC // Configures the ADC module's offset trim ADC_setOffsetTrimAll(ADC_REFERENCE_EXTERNAL,ADC_REFERENCE_3_3V); // Configures the analog-to-digital converter module prescaler. ADC_setPrescaler(AD_SU_BASE, ADC_CLK_DIV_2_0); // Sets the timing of the end-of-conversion pulse ADC_setInterruptPulseMode(AD_SU_BASE, ADC_PULSE_END_OF_CONV); // Powers up the analog-to-digital converter core. ADC_enableConverter(AD_SU_BASE); // Delay for 1ms to allow ADC time to power up DEVICE_DELAY_US(500);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// SOC Configuration: Setup ADC EPWM channel and trigger settings // Disables SOC burst mode. ADC_disableBurstMode(AD_SU_BASE); // Sets the priority mode of the SOCs. ADC_setSOCPriority(AD_SU_BASE, ADC_PRI_ALL_ROUND_ROBIN); // Start of Conversion 0 Configuration // Configures a start-of-conversion (SOC) in the ADC and its interrupt SOC trigger. // SOC number : 0 // Trigger : ADC_TRIGGER_EPWM3_SOCA // Channel : ADC_CH_ADCIN0 // Sample Window : 16 SYSCLK cycles // Interrupt Trigger: ADC_INT_SOC_TRIGGER_NONE ADC_setupSOC(AD_SU_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM3_SOCA, ADC_CH_ADCIN0, 16U); ADC_setInterruptSOCTrigger(AD_SU_BASE, ADC_SOC_NUMBER0, ADC_INT_SOC_TRIGGER_NONE); // ADC Interrupt 1 Configuration // SOC/EOC number : 0 // Interrupt Source: enabled // Continuous Mode : enabled ADC_setInterruptSource(AD_SU_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER0); ADC_enableInterrupt(AD_SU_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(AD_SU_BASE, ADC_INT_NUMBER1); ADC_enableContinuousMode(AD_SU_BASE, ADC_INT_NUMBER1);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]}[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]void FB_start(void) { EPWM_clearADCTriggerFlag(EPWM_AD_BASE, EPWM_SOC_A);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]ADC_clearInterruptStatus(AD_PI_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(AD_SI_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(AD_SU_BASE, ADC_INT_NUMBER1);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]DMA_clearTriggerFlag(DMA_CH1_BASE); DMA_clearTriggerFlag(DMA_CH2_BASE); DMA_clearTriggerFlag(DMA_CH3_BASE);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="] // Clearing all pending interrupt flags & Start DMA //DMA_clearTriggerFlag(DMA_CH1_BASE); DMA_startChannel(DMA_CH1_BASE); //DMA_clearTriggerFlag(DMA_CH2_BASE); DMA_startChannel(DMA_CH2_BASE); //DMA_clearTriggerFlag(DMA_CH3_BASE); DMA_startChannel(DMA_CH3_BASE);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]EPWM_enableADCTrigger(EPWM_AD_BASE, EPWM_SOC_A); }[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]SPI配置:[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]SPi_To_N32_Init(); // // // // Initialize DMA // // // DMA_initController(); DMA_triggerSoftReset(DMA_CH4_BASE); DMA_triggerSoftReset(DMA_CH5_BASE); //---------------------------------------------------------------------------------------------------------------------------------- // DMA channel 4 set up for SPI_RX DMA_configAddresses(DMA_CH4_BASE, (uint16_t *)DSP_RxArray, (uint16_t *)(SCR_SPI_BASE + SPI_O_RXBUF)); // Perform enough 16-word bursts to fill the results buffer. Data will be // transferred 32 bits at a time hence the address steps below. DMA_configBurst(DMA_CH4_BASE, burst_size, 0, 1); DMA_configTransfer(DMA_CH4_BASE, transfer_size, 0, 1); DMA_configMode(DMA_CH4_BASE, DMA_TRIGGER_SPIARX, (DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_ENABLE | DMA_CFG_SIZE_16BIT));[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// // Configure DMA Ch4 interrupts // DMA_setInterruptMode(DMA_CH4_BASE, DMA_INT_AT_END); DMA_enableInterrupt(DMA_CH4_BASE); DMA_enableTrigger(DMA_CH4_BASE);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// DMA channel 5 set up for SPI_TX DMA_configAddresses(DMA_CH5_BASE, (uint16_t *)(SCR_SPI_BASE + SPI_O_TXBUF), (uint16_t *)DSP_TxArray); // Perform enough 16-word bursts to fill the results buffer. Data will be // transferred 32 bits at a time hence the address steps below. DMA_configBurst(DMA_CH5_BASE, burst_size, 1, 0); DMA_configTransfer(DMA_CH5_BASE, transfer_size, 1, 0); DMA_configMode(DMA_CH5_BASE, DMA_TRIGGER_SPIATX, (DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_ENABLE | DMA_CFG_SIZE_16BIT));[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// // Configure DMA Ch5 interrupts // DMA_setInterruptMode(DMA_CH5_BASE, DMA_INT_AT_END); DMA_enableInterrupt(DMA_CH5_BASE); DMA_enableTrigger(DMA_CH5_BASE);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]//SCR_SPI initialization SPI_disableModule(SCR_SPI_BASE); SPI_clearInterruptStatus(SCR_SPI_BASE, SPI_INT_RXFF | SPI_INT_TXFF); SPI_setFIFOInterruptLevel(SCR_SPI_BASE, SPI_FIFO_TX8, SPI_FIFO_RX8); SPI_setConfig(SCR_SPI_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA1, SPI_MODE_SLAVE, 15000000, 16); SPI_disableLoopback(SCR_SPI_BASE); SPI_enableFIFO(SCR_SPI_BASE); SPI_setEmulationMode(SCR_SPI_BASE, SPI_EMULATION_STOP_MIDWAY); SPI_enableInterrupt(SCR_SPI_BASE, SPI_INT_RXFF | SPI_INT_TXFF); SPI_enableModule(SCR_SPI_BASE);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// SPI_FIFO DMA_startChannel(DMA_CH4_BASE); DMA_startChannel(DMA_CH5_BASE);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]}[/font][/backcolor][/color][/align]

    DSP TI 技术交流 使用 从机 TMS320F280049

    389浏览量 0回复量 关注量
  • DMA+串口空闲中断接收数据,是不是不能改接收时间间隔? 赏3000家园币

    请问,DMA+串口空闲中断接收数据,是不是不能改接收时间间隔?也就是说,比如主机给从机发送AT+CMD,等了30ms发了一个OK,我想要这两截数据拼成一包做数据解析,这种用DMA+串口空闲中断接收数据是不是接收不全啊?

    DMA 接收 串口空闲中断 30 从机发送 从机

    7061浏览量 19回复量 关注量
  • N32G435单片机SPI无法读到从机数据

    SPI写数据进从机寄存器没有问题,波形正常,且从机驱动。但是写完数据后从从机读取寄存器数据,发现读取不到从机数据,测量波形发现,发送从机地址的波形正确,但是从机未回任何数据,时钟也只有8个周期(发送数据的),没有读数据的时钟。 如下是读取从机寄存器值的函数, uint32_t TDC7200_ReadByte(uint8_t addr) { uint32_t Rd_Data; SPI_CS_L_TDC7200(); SPI_WriteByte(addr); Rd_Data = SPI_ReadByte(); SPI_CS_H_TDC7200(); return Rd_Data; Delay(1); } SPI读数据,使用的是官方例程中的代码,只是在前面增加了一段等待接收完成。 uint8_t SPI_ReadByte(void) { while (SPI_I2S_GetStatus(SPI1, SPI_I2S_RNE_FLAG) == RESET) ; /* Check the parameters */ assert_param(IS_SPI_PERIPH(SPI1)); /* Return the data in the DAT register */ return SPI1->DAT; }

    N32G435 国产芯片 spi 从机 单片机

    1459浏览量 3回复量 关注量
  • RS485 AB波形分析

    [i=s] 本帖最后由 kate2005 于 2024-12-26 17:41 编辑 [/i] 在办公室调试时,485主机主板PCB和从机共用市电电源,主机用UART3,与从机通信良好;主机板(不接大地)安装到空调机组上后 (含UART1 UART2都是485信号,分别与其他控制板通信),与从机(从机机壳接大地)共用高低温实验室的供电电源,会通信不良,在从机端口测A/B信号,发现很奇怪的波形。见附图1,波形来不及细抓,只有这个图。 这时如果主机主板PCB的电源换成其他外接电源,其他都不变,主机的UART3和从机通讯又是正常的。没有波形图。只看到现象。 求助大佬帮忙分析波形的无数据时AB为何没有压差了?波形为何如此差? 更换主板PCB电源后通信又正常了,可从哪些方面分析?

    RS485;技术交流 RS485 AB 波形分析 从机 电源

    7050浏览量 14回复量 关注量
  • RS485 从机收不到数据

    [i=s] 本帖最后由 kate2005 于 2024-12-26 15:02 编辑 [/i] 问题描述: RS485主机和从机用电源LN,测试环境是可以控制高低温的实验室,正常情况下,主从机通讯正常,从机用来控制一个电流为10几安的电机运转。 连接方式见附图,附图1是指示图。 低温零下十几度正常运转2天后,发生了通讯故障,现象是从机表现为收不到主机数据,这时从机会主动定时发送一组数据,这是从机的软件策略。 附图2无法通信时的从机端AB线波形,测试波形时并没有运转电机。 如果断开主机和从机的AB两线,5V和地仍然按原来的连接(主机板供电给从机的485电路),AB线用笔记本和USB转RS485模块,发现从机通信正常。当时无示波器无图。 各位大佬帮忙分析一下,为何从机无法收到主机的数据? [url=Desktop\微信图片_20241226140459.jpg][img]Desktop\微信图片_20241226140459.jpg[/img][/url]

    RS485 从机 AB 通信 通讯

    7487浏览量 15回复量 关注量
  • 4014触摸芯片EZI2C从机拉低主控SCL不释放

    主控芯片采用GPIO去模拟I2C主机,4014采用EZI2C硬件从机;主控每隔20ms去读一次从机数据,运行过程中会出现SCL被拉低不释放的问题,通过测量发现是4014拉低了SCL;请问什么情况下4014 EZI2C从机会拉低SCL不释放?

    采用 SCL 触摸芯片 从机 EZI2C

    10600浏览量 7回复量 关注量
  • ch32v103 c8t6 如何支持中断发送 sos

    hi, 我根据https://bbs.21ic.com/icview-3141094-1-1.html sample代码,可以实现从机接收。(主机为RK3566, 从机CH32V103) 即主机可以i2c_write成功。 但如果调用 i2c_read, 则ch32v103会 一直拉低I2C CLK线,CH32只产生了三个中断,最后一个中断报ACK FAILED。 int R1:2 R2:2, TxCount:0 int R1:82 R2:6, TxCount:0 error int :480 6 I2C_IT_AF 出现以上问题后,必须复位CH32V103才会使I2C CLK线重新拉高。 请问是否有中断从机发的sample code. 目前代码如下: //下述中断程序中,当主机读取和写入数据时,都会引起地址位被置位,即发生EV1事件(即本中断处理程序中将发送和接收的EV1合并了); //当主机写入数据时,中断的执行顺序是EV1―>EV2―>EV4,其中有多个数据EV2会多次执行; //当主机读取数据时,中断的执行顺序是EV1―>EV3―>EV3-2,本中断程序中将EV3和EV3-1合并了,若有多个数据,EV3将多次执行。 //本程序只进行从机中断接收 //事件中断处理函数 void I2C1_EV_IRQHandler( void ) { uint16_t STAR1Register,STAR2Register; int i = 0; u8 rcv = 0; //状态寄存器1和状态寄存器2对应值 STAR1Register = I2C1->STAR1; STAR2Register = I2C1->STAR2; printf("int R1:%x R2:%x, TxCount:%d\r\n", STAR1Register, STAR2Register, TxCount); //I2C从机 (MSL = 0) //若状态寄存器2的位0不为1,即为0,则代表从模式(1代表主模式) if( ( STAR2Register & 0x0001 ) == 0x0000 ) { //从机发送数据 发送数据(TxE = 1: EV3、EV3-1) //从模式下,若状态寄存器1 位7 TxE位为1,则数据寄存器空 if( (STAR1Register & 0x0080) == 0x0080) { I2C1->DATAR = TxData[ TxCount ]; //printf("Tx:W reg:%x\r\n", TxData[ TxCount ]); TxCount++; STAR1Register = 0; STAR2Register = 0; //RxData[ RxCount ] = I2C1->DATAR; } //从模式下,若状态寄存器1 位1 ADDR的位为1,收到的地址匹配,即 主机已发送地址,地址为被置位・(ADDR = 1: EV1(包括发送和接收)) if( STAR1Register & 0x0002 ) { //清除相应值 STAR1Register = 0; STAR2Register = 0; RxCount = 0x00; TxCount = 0x00; } //从机接收到数据 (RXNE = 1: EV2) //从模式下,若状态寄存器1 位6 RxNE位为1,则数据寄存器非空 if( STAR1Register & 0x0040 ) { RxData[ RxCount ] = I2C1->DATAR; printf("40 rx reg:%x\r\n", RxData[RxCount]); RxCount++; STAR1Register = 0; STAR2Register = 0; } //从机接收到停止信号,检测到停止条件(STOPF =1: EV4) //从模式下,若状态寄存器1 位4 STOPF位为1,则检测到停止条件 if( STAR1Register & 0x0010 ) { //控制寄存器1 位0设置为1,启用IIC模块 I2C1->CTLR1 |= 0x0001; STAR1Register = 0; STAR2Register = 0; Rec_Finish_Flag = 0x01; } //从机发送数据 发送数据(TxE = 1: EV3、EV3-1) //从模式下,若状态寄存器1 位7 TxE位为1,则数据寄存器空 if( (STAR1Register & 0x0080) == 0x0080) { I2C1->DATAR = TxData[ TxCount ]; TxCount++; STAR1Register = 0; STAR2Register = 0; RxData[ RxCount ] = I2C1->DATAR; printf("rx reg:%x\r\n", RxData[RxCount]); } //从机接收非应答信号 检测到非应答(AF =1: EV3-2) //从模式下,若状态寄存器1 位10 AF位为1,则应答失败(当没有返回应答时,硬件将置该位为’1’) if( STAR1Register & 0x0400 ) { printf("event AF ERROR\r\n"); I2C1->STAR1 &= ~( 0x0400 ); //该位由软件写’0’清除,或在PE=0时由硬件清除。 I2C1->STAR1 &= ( 0xFDFF ); STAR1Register = 0; STAR2Register = 0; } } //printf("out int :%x %x, TxCount:%d\r\n", STAR1Register, STAR2Register, TxCount); } //错误中断处理函数 //下述程序中,发送各种错误进行错误中断不做对应的处理,最后只进行清除寄存器(STAR1和STAR2)操作。 void I2C1_ER_IRQHandler(void) { uint16_t STAR1Register,STAR2Register; //状态寄存器1和状态寄存器2对应值 STAR1Register = I2C1->STAR1; STAR2Register = I2C1->STAR2; printf("error int :%x %x\r\n", STAR1Register, STAR2Register); if(I2C_GetITStatus(I2C1, I2C_IT_SMBALERT)) { printf("I2C_IT_SMBALERT\r\n"); } else if(I2C_GetITStatus(I2C1, I2C_IT_TIMEOUT)) { printf("I2C_IT_TIMEOUT\r\n"); } else if(I2C_GetITStatus(I2C1, I2C_IT_PECERR)) { printf("I2C_IT_PECERR\r\n"); } else if(I2C_GetITStatus(I2C1, I2C_IT_OVR)) { printf("I2C_IT_OVR\r\n"); } else if(I2C_GetITStatus(I2C1, I2C_IT_AF)) { I2C_ClearITPendingBit(I2C1, I2C_IT_AF); I2C1->STAR1 &= ~( 0x0400 ); //该位由软件写’0’清除,或在PE=0时由硬件清除。 I2C1->STAR1 &= ( 0xFDFF ); STAR1Register = 0; STAR2Register = 0; printf("I2C_IT_AF\r\n"); //IIC_Init(g_bound, g_address); } else if(I2C_GetITStatus(I2C1, I2C_IT_ARLO)) { printf("I2C_IT_ARLO\r\n"); } else if(I2C_GetITStatus(I2C1, I2C_IT_BERR)) { printf("I2C_IT_BERR\r\n"); } //控制寄存器1 位0设置为1,启用IIC模块 I2C1->CTLR1 |= 0x0001; STAR1Register = 0; STAR2Register = 0; }

    I2c CH32V103 从机

    1872浏览量 0回复量 关注量