Есть проект

Соорудил платформу на которой живут две технологии АРМ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;
}
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);
I2C_OwnAddress2Config(I2C1, SLAVE_ADDRESS);
/* Enable I2C2 Dual address */
I2C_DualAddressCmd(I2C1, ENABLE);
до конца не могу понять для чего они , может их надо использовать?
Сталкивался кто либо с такой задачей или знает в каком русле рыть? буду благодарен.