本帖最后由 woshilee 于 2014-11-26 16:26 编辑 我用STM32F103的I2C1作为主接收器,I2C2作为从发送器,程序如下,程序总是会卡在判断ADDR位那里,就是红色部分,小弟菜鸟,不知道对I2C的理解哪里不对,就是无法运行,很捉急,谢谢大神帮忙了 #include <stm32f10x.h> #include <stdio.h> u8 Getbyte=0; u8 i=0; u8 flag1=0,flag2=0,sendflag=0; /***************************************************** 函数: void Delay(vu32 nCount) 参数: vu32 nCount 延时时间 描述: 延时指定时间 返回: 无 ******************************************************/ void Delay(vu32 nCount) { for(; nCount != 0; nCount--); } /********************USART1配置函数************************/ void USART1_Config(void) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200; //串口的波特率,例如115200 最高达4.5Mbits/s USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据字长度(8位或9位) USART_InitStructure.USART_StopBits = USART_StopBits_1; //可配置的停止位-支持1或2个停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //双工模式,使能发送和接收 USART_Init(USART1, &USART_InitStructure); // 调用STM32的USART初始化底层函数 USART_Cmd(USART1,ENABLE); } void I2C_Config(void) { I2C_InitTypeDef I2C_InitStructure; /* I2C configuration */ I2C_DeInit(I2C1); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0xA1; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 400000; I2C_Cmd(I2C1, ENABLE); I2C_Init(I2C1, &I2C_InitStructure); I2C_AcknowledgeConfig(I2C1, ENABLE); I2C_DeInit(I2C2); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0xA2; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 400000; I2C_Init(I2C2, &I2C_InitStructure); I2C_Cmd(I2C2, ENABLE); /*允许1字节1应答模式*/ I2C_AcknowledgeConfig(I2C2, ENABLE); } /********************GPIO配置函数************************/ void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO_InitTypeDef类型结构体GPIO_InitStructure GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_10|GPIO_Pin_11; //PB.6,PB.7 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //复用开漏输出 GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); } /********************时钟配置函数************************/ void RCC_Config(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE); //使能GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1|RCC_APB1Periph_I2C2, ENABLE); //使能usart1时钟 } /********************printf函数支持函数************************/ int fputc(int ch, FILE *f) { /* Place your implementation of fputc here */ /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} /* e.g. write a character to the USART */ USART_SendData(USART1, (uint8_t) ch); return ch; } int fgetc(FILE *fp) { int ch = 0; while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) { } ch = (int)USART1->DR & 0xFF; putchar(ch); //回显 return ch; } /********************主函数************************/ int main(void) { RCC_Config(); GPIO_Config(); USART1_Config(); I2C_Config(); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C1, ENABLE);// 在BUSY=0时发送起发送起始条件,进入主模式 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));// 发生以后读SR1并写DR,((uint32_t)0x00030001) /* BUSY总线忙, MSL主模式 and SB起始条件已发送 flag */ I2C_Send7bitAddress(I2C1, 0xA2, I2C_Direction_Receiver);//发送地址,最后一位为1写,最后一位为0读 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); while(I2C_GetFlagStatus(I2C2, I2C_FLAG_ADDR) == RESET); I2C_SendData(I2C2, 0xff); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET); Getbyte=I2C_ReceiveData(I2C1); I2C_AcknowledgeConfig(I2C1, DISABLE); I2C_AcknowledgeConfig(I2C2, DISABLE); I2C_GenerateSTOP(I2C1, ENABLE); printf("\r\n%d\r\n",Getbyte); while(1); } |
I2C_Slave_Send.rar
下载3.91 MB, 下载次数: 207, 下载积分: ST金币 -1
想请教一下 F030 如何配置成i2c的从机啊 就是ping同了从机地址之后 从机就发送一组数据~~
我现在用DMA模式 只能发送一次 之后就 主机读I2c 就会出现I2c总线超时了~
左移两位?这个手册上有提到吗?
初始化不能放在一起ishi库有问题吧?总不至于是硬件问题
说错了 ,左移一位,不好意思哈
多参考几个程序看看,有写错的地方没 ,红色的地方是 I2C库函数 ,头文件包了吗
是ST的参考手册上说的吗?
7位地址+1位读写,手册上没有直接,要你自己做的时候理解,看官网的历程,不过直接用查询的IIC不好用,建议用终端或者DMA