最近 学习 I2C 主从机中断 或 DMA 中断? 连续收送数据,一直没掌握。找到这篇 文章,没有完整程序,请问 官方 有类似完整程序 可以发我下吗
请教 下 杨工, 怎样 向 中断发送 传入 需要 发送的 变化 数据? 我尝试各种方法,不得要领.
试了下面方法,不行。
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);
}
}
你好,开启第二次传输直接产生起始位就可以了,如图是在我上面主中断发例程基础上加的,传输完重新对数组赋值就好了,可观察到从机一直在接收数据
明白了,非常感谢。
还需 在 麻烦 请教 下 杨工, 那么 官方 I2C DMA 主机发送数据例程,怎样 修改,才可以 能 循环发送数据啊。 我这样放在循环中,只有每次 重启 才发 一次数据
和上面基本一致,需要启动二次传输时先关闭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);
}
}
参考,接收用之前发的例程即可
多谢你耐心的 指导,在配合 看下 DMA 功能描述
3) 在 DMA_CNTRx 寄存器中设置要传输的数据数量。在每个数据传输后,这个数值递减
就 豁然开朗了。 再次 感谢 你耐心的指导。