Игорь Кищак 0 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба Всем доброго времени! Есть проект )) Соорудил платформу на которой живут две технологии АРМ9(NUC950ADN) + CortexM3(stm32F2). На АРМ9 линукс+файловая, CortexM3 - standalone (пока без фриртоса). Комуникация между двумя камнями предусмотрел частично по USART частично по I2C чтобы не вешать все на один протокол (АРМ9 играет роль как-бы главной системы для выхода в сеть, ну и больше гипкости с операционкой)))), роль CortexM3 сбор информации с различных подключенных к ниму датчиков, сенсоров... обработка их, ну и дальнейшая передача АРМУ. Часть информации передается по USART, там вроде все понятно, с I2C озадачился: на ARM9 компильнул и установил I2С тулзы, на М3 поднял либу подсмотрев пример в "STM32F2xx_StdPeriph_Examples\I2C\I2C_TwoBoards". по дефолту решил что АРМ9 мастер - М3 слейв. Проблема с ледующего характера: надо из М3 сделать адекватного слейва (похожего на ЕЕПРОМ) который смог бы реагировать на вот такие команды "i2cget -y -0 0x18 0x01" исплоьзуя пример: /* Get Last I2C Event */ Event = I2C_GetLastEvent(I2Cx); switch (Event) { /* ****************************************************************************/ /* Slave Transmitter Events */ /* */ /* ****************************************************************************/ /* Check on EV1 */ case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: I2C_SendData(I2Cx, TxBuffer[Tx_Idx++]); I2C_ITConfig(I2Cx, I2C_IT_BUF , ENABLE); break; /* Check on EV3 */ case I2C_EVENT_SLAVE_BYTE_TRANSMITTING: case I2C_EVENT_SLAVE_BYTE_TRANSMITTED: if (Tx_Idx < NumberOfByteToTransmit) { I2C_SendData(I2Cx, TxBuffer[Tx_Idx++]); } else { /* Disable I2C event interrupt */ I2C_ITConfig(I2Cx, I2C_IT_EVT | I2C_IT_BUF, DISABLE); } break; /* ****************************************************************************/ /* Slave Receiver Events */ /* */ /* ****************************************************************************/ /* check on EV1*/ case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: Rx_Idx = 0x00; break; /* Check on EV2*/ case I2C_EVENT_SLAVE_BYTE_RECEIVED: case (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_SR1_BTF): RxBuffer[Rx_Idx++] = I2C_ReceiveData(I2Cx); break; /* Check on EV4 */ case I2C_EVENT_SLAVE_STOP_DETECTED: I2C_GetFlagStatus(I2Cx, I2C_FLAG_STOPF); I2C_Cmd(I2Cx, ENABLE); break; default: break; } нормально работают команды i2cget -y 0 0x18 - получить значение которое хранится в буфере, i2cset -y 0 0x18 0x2 0x3 - переслать слейву значение 0х3 в регистр 0х2, А из под линукса буду работать именно "i2cget -y 0 0x18 0х00". считать данные по такому то адресу с такого то регистра. Тоесть я понимаю что проблема в коде и его надо переделать, так-как данный пример заточет под просто отправку и под просто прием. А мне надо грубо рабоать с ним как-бы с EEPROM тоесть режим комбинированного старта где пакет " START+ADDR+W+ack+DATA+ACK+STAR2+ADDR+R+ACK" тоесть режим повторног старта когда мастер нагло еще раз лезит со стартом и повторным адресом (так мой осцилограф показывает) ? После прочтений даташитов и еще прочтений и надо будет еще читать понял то, что мало понял что там ST накрутил.. есть такие функции /* I2C2 second address configuration */ I2C_OwnAddress2Config(I2C1, SLAVE_ADDRESS); /* Enable I2C2 Dual address */ I2C_DualAddressCmd(I2C1, ENABLE); до конца не могу понять для чего они , может их надо использовать? Сталкивался кто либо с такой задачей или знает в каком русле рыть? буду благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться