请问 有这篇文章的 I2C--主从机的中断收发 完整程序 或 类似程序 吗?

最近 学习 I2C 主从机中断 或 DMA 中断? 连续收送数据,一直没掌握。找到这篇 文章,没有完整程序,请问 官方 有类似完整程序 可以发我下吗

11111111111111.jpg22222222222.jpg3333333333.jpg


icon_rar.gifV203C8-IIC主中断发-从中断收.zip

icon_rar.gifV203C8-IIC主中断收-从中断发.zip

你好,参考


请教 下 杨工,  怎样 向  中断发送 传入 需要 发送的 变化 数据?   我尝试各种方法,不得要领.


试了下面方法,不行。

int main(void)

{

    Delay_Init();

    USART_Printf_Init( 115200 );

    printf( "SystemClk:%d\r\n", SystemCoreClock );

    printf("IIC Host mode\r\n");

    IIC_Init( 80000, TxAdderss);    //IIC波特率:80kHz,自身地址最后一位为0,进入主发送器模式

    iic_int();


    while(1){

        TxData[5] = TxData[5] + 1;

        if(TxData[5] > 200){

           TxData[5] = 0;

        }

        while( I2C_GetFlagStatus( I2C1, I2C_FLAG_BUSY ) != RESET );

        I2C_GenerateSTART(I2C1, ENABLE);   // 生成I2Cx通信START条件

        Delay_Ms(600);

    }

}



你好,开启第二次传输直接产生起始位就可以了,如图是在我上面主中断发例程基础上加的,传输完重新对数组赋值就好了,可观察到从机一直在接收数据

image.pngimage.png


明白了,非常感谢。


还需 在  麻烦 请教 下 杨工,  那么 官方 I2C DMA 主机发送数据例程,怎样 修改,才可以 能 循环发送数据啊。   我这样放在循环中,只有每次 重启 才发 一次数据1111111111111.jpg


和上面基本一致,需要启动二次传输时先关闭DMA通道,然后给DMA传入要发送的数据,主机端产生起始信号,判断EV5,EV6事件,也就是起始位发送标志位和地址匹配标志成立后即可再次启动DMA的传输。


不好意思 杨工,我是半路出家,不太懂专业名词,都是 靠着 兴趣  依葫芦画瓢 学习的。  我刚尝试 你 说的,编排下 程序 还是不行。 能再麻烦你 帮我 把  while(1) 内程序  循环改一下,让 I2C 能够 循环 发出 传入的数据吗?  

int main(void)

{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

    Delay_Init();

    USART_Printf_Init(115200);

    printf("SystemClk:%d\r\n", SystemCoreClock);

    printf("IIC Host mode\r\n");

    DMA_Tx_Init( DMA1_Channel6, (u32) &I2C1->DATAR, (u32) TxData, Tize);   //DMA初始化

    IIC_Init(10000, TxAdderss);   //I2C进行主机初始化配置

    while(1) {

       DMA_Cmd(DMA1_Channel6, DISABLE);                // 关闭DMA1_Channel6不再发送数据

     //   I2C_GenerateSTART( I2C1, ENABLE );

        TxData[6] = TxData[6] + 1;

             if(TxData[6] > 230) {

                 TxData[6] = 0;

             }

        while( I2C_GetFlagStatus( I2C1, I2C_FLAG_BUSY ) != RESET ); //检查是否设置了指定I2C标志

        I2C_GenerateSTART( I2C1, ENABLE );//  //开启I2C1通信起始信号

        //当最后一个事件为I2C_EVENT_MASTER_MODE_SELECT事件时,说明选择I2C作为主机模式,跳过此while循环,进行下一步

        while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );//检查最后一个I2Cx事件是否等于作为参数传递的事件

        //发送地址来选择从机设备

        I2C_Send7bitAddress( I2C1, 0x02, I2C_Direction_Transmitter );

        //当最后一个事件为I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED事件时,说明选择I2C进行主机发送,跳过此while循环,进行下一步数据发送

        while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) );

        DMA_Cmd( DMA1_Channel6, ENABLE );  //  //使能开启DMA1通道6,进行数据发送

        //当最后一个事件为I2C_EVENT_MASTER_BYTE_TRANSMITTED事件时,说明发送结束,跳过此while循环,进行下一步

        while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );

        I2C_GenerateSTOP( I2C1, ENABLE );  // //开启I2C通信停止信号


        printf(" ***************************  \r\n");

        Delay_Ms(500);

    }

}

icon_rar.gifmain.zip



参考,接收用之前发的例程即可

image.png


 多谢你耐心的 指导,在配合 看下 DMA 功能描述

3) 在 DMA_CNTRx 寄存器中设置要传输的数据数量。在每个数据传输后,这个数值递减

就 豁然开朗了。   再次 感谢 你耐心的指导。


只有登录才能回复,可以选择微信账号登录