Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.190.156.212] |
|
Сообщ.
#1
,
|
|
|
использую контроллер stm32f103cb. Требуется связать этот контроллер с девайсом по I2C т.е. передать несколько байт устройству после дождаться когда реди ножка упадет в ноль(она в единице пока данные не готовы для чтения) и прочитать несколько байт. Возникла проблема при настройки реди ножки. Связь по I2C установить удалось, но только если реди ножка настроена как аналоговый вход (GPIO_Mode_AIN) и при этом не получается ждать реди ножку т.е. статус у реди ножки всегда RESET. При настройке ножки как GPIO_Mode_IPU (input pull up) или при настройкe GPIO_Mode_IPD (input pull down) связь по I2C не устанавливается а именно висит на проверке флага I2C_EVENT_MASTER_MODE_SELECT...
вот код настройки портов: GPIO_InitTypeDef GPIO_InitStructure; /* Configure I2C2 pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); /* remap USART1 on port B6(Tx) B7(Rx) */ //GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE); /* Configure USART2 Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure PA3 */ // it's pin for slave rady GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); вот настройка i2c I2C_InitTypeDef I2C_InitStructure; /* make defult set */ I2C_DeInit(I2C2); /* do sitings */ I2C_InitStructure.I2C_ClockSpeed = 10000; // 90kHz I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x50; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init(I2C2, &I2C_InitStructure); /* Emable i2c2 interface */ I2C_Cmd(I2C2, ENABLE); и вот функции записи и чтения по I2C void Read(void) { /* start */ I2C_GenerateSTART(I2C2,ENABLE); /* check master mode select */ while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); /* choose a device & mode */ I2C_Send7bitAddress(I2C2, Address_Slave, I2C_Direction_Transmitter); /* check transmitting success */ while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING)); /* first address */ I2C_SendData(I2C2, Start_address_config); /* chek & clear bit status */ while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING)); /* start */ I2C_GenerateSTART(I2C2,ENABLE); /* check master mode select */ while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); /* choose a device & receive mode*/ I2C_Send7bitAddress(I2C2, Address_Slave, I2C_Direction_Receiver); /* check transmitting success */ while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); while(Bit_SET == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)); for(i=2; i<9; i++) { /* wait for ready bit (bit reset) */ //delay(100); //delay(10000000); /* wait for slave */ while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)); I2C_AcknowledgeConfig(I2C2, ENABLE); USART2_TxBuffer[i] = I2C_ReceiveData(I2C2); } /* wait for ready bit (bit reset) */ //while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)); /* wait for slave */ while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)); I2C_AcknowledgeConfig(I2C2, DISABLE); USART2_TxBuffer[9] = I2C_ReceiveData(I2C2); USART2_TxBuffer[10] = 'F'; USART2_TxBuffer[11] = 'I'; /* stop */ I2C_GenerateSTOP(I2C2, ENABLE); } Надеюсь что объяснил проблему понятно=)) Спасибо за ответы |