Перейти к содержанию
    

CC1310, I2C Slave Driver

Добрый день! В RTOS TI для микроконтроллера CC1310 не реализован драйвер I2C в режиме Slave. Если кто написал или есть нужная ссылка- не поделитесь ли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отвечаю сам себе, может, кому пригодится.
Код работает, хотя далёк от совершенства, шлифовать нет времени - надо сдавать железо. 
В 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);
     }
   }
 }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...