JohnKorsh 1 26 мая, 2023 Опубликовано 26 мая, 2023 · Жалоба Добрый день! В RTOS TI для микроконтроллера CC1310 не реализован драйвер I2C в режиме Slave. Если кто написал или есть нужная ссылка- не поделитесь ли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
JohnKorsh 1 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба Отвечаю сам себе, может, кому пригодится. Код работает, хотя далёк от совершенства, шлифовать нет времени - надо сдавать железо. В CC1310 I2C периферия для Master и Slave сделана в виде раздельных коммутируемых аппаратных модулей. Я инициализирую I2C в режиме Master Blocking. В результате на периферию подаётся питание и тактовые импульсы. Затем отключаю аппаратный блок Master и включаю аппаратный блок Slave. С прерываниями пока не получается, поэтому, обработку I2C сделал отдельной задачей с высоким приоритетом - у меня тактовая I2C минимальная - 100 КГц. Вот нужные фрагменты кода (инициализация I2C Master - взял из TI примера и здесь не привожу). #include "driverlib/I2C.h" ... // // I2C variables. // volatile uint8_t Reg_Addr = 0; volatile uint8_t i2c_txBuffer [16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; volatile uint8_t i2c_rxBuffer [16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; ... В однокрантно выполняемую в начале программы задачу включил следующий код: // // Set of the I2C Slave mode. // I2CMasterDisable (I2C_Base); // I2C Master Disable. I2CMasterIntDisable (I2C_Base); // I2C Master Interrupt disable. I2CMasterIntClear (I2C_Base); // I2C Master Interrupt Clear. I2CSlaveInit (I2C_Base, I2C_ADDR); // I2C Slave Enable and set I2C Address. I2CSlaveIntClear (I2C_Base, I2C_SLAVE_INT_START); // I2C Slave Status Clear. I2CSlaveIntClear (I2C_Base, I2C_SLAVE_INT_DATA); I2CSlaveIntClear (I2C_Base, I2C_SLAVE_INT_STOP); ... Обработка - отдельная задача; // // I2C Slave Task. //******************************************************************** // void I2C_Slave (void) { uint32_t I2C_Status = 0; uint8_t i = 0; uint16_t Work = 0; bool Rec_Flag = false; // //--------------------------------------------------------------- // while (1) { I2C_Status = I2CSlaveStatus (I2C_Base); // if (((I2C_Status & I2C_SLAVE_ACT_RREQ_FBR) == I2C_SLAVE_ACT_RREQ_FBR) && ((I2C_Status & I2C_SLAVE_ACT_RREQ) == I2C_SLAVE_ACT_RREQ)) { Reg_Addr = I2CSlaveDataGet (I2C_Base) & 0xFF; I2CSlaveDataPut (I2C_Base, i2c_txBuffer [Reg_Addr]); for (i = 0; i < 16; i++) { i2c_rxBuffer = 0; // Reset of the Rx Buffer. } Rec_Flag = false; PIN_setOutputValue (ledPinHandle, LED_5, 1); // Switch of the indication I2CSlaveIntClear (I2C_Base, I2C_SLAVE_INT_START); I2CSlaveIntClear (I2C_Base, I2C_SLAVE_INT_DATA); I2CSlaveIntClear (I2C_Base, I2C_SLAVE_INT_STOP); } // else if ((I2C_Status & I2C_SLAVE_ACT_RREQ) == I2C_SLAVE_ACT_RREQ) { if (Reg_Addr < 10) { i2c_rxBuffer [Reg_Addr] = I2CSlaveDataGet (I2C_Base) & 0xFF; Reg_Addr++; } Rec_Flag = false; I2CSlaveIntClear (I2C_Base, I2C_SLAVE_INT_DATA); } // else if ((I2C_Status & I2C_SLAVE_ACT_TREQ) == I2C_SLAVE_ACT_TREQ) { if (Reg_Addr < 10) { I2CSlaveDataPut (I2C_Base, i2c_txBuffer [Reg_Addr]); Reg_Addr++; } Rec_Flag = true; I2CSlaveIntClear (I2C_Base, I2C_SLAVE_INT_DATA); } // else if (I2CSlaveIntStatus (I2C_Base, false) == I2C_SLAVE_INT_STOP) { i = I2CSlaveDataGet (I2C_Base) & 0xFF; // Reset of the I2C Status. PIN_setOutputValue (ledPinHandle, LED_5, 0); // Switch of the indication // // Check and rewrite of the received parametrs. // if (Rec_Flag == true) { // Здесь ставлю на исполнение задачу обработки принятых данных. В этой задаче кладу результат в i2c_txBuffer []. } // I2CSlaveIntClear (I2C_Base, I2C_SLAVE_INT_START); I2CSlaveIntClear (I2C_Base, I2C_SLAVE_INT_DATA); I2CSlaveIntClear (I2C_Base, I2C_SLAVE_INT_STOP); } } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться