Поиск по этому блогу

воскресенье, 21 августа 2011 г.

Софтовый i2c и общение с датчиком DS1624

Возник на горизонте один проект, в котором было решено использовать новые контроллеры с продвинутым Сигма-дельта АЦП 24бит (!) MSP430AFE253. У контроллера встроенно три(!) независимых сигма-дельта АЦП, и это чудо в компеле стоит около 2$.
Заказал у TI some Free samples и попросил заказчика купить небольшую партию для установочного производства... Срок поставки 3 недели. Решил пока поэксперементировать с недавно пришедшими по FedEx в наши *ня двумя новыми MSP430G2452, которые дружат с Launchpad после обновления прошивки. На них и отработаю soft i2c.
Проблема у 253 следующая: там нет аппартного модуля i2c. Но этот кристалл также должен управлять цифровыми потенциометрами по этому протоколу. Сначала я пригорюнился, но потом храбро решил реализовать i2c программно. В режиме мастера это не так сложно.
Digipot тоже ехал с эльфийского Запада неторопливо. Поэтому, порывшись по сусекам обнаружил завалявшийся DS1624 - продвинутый цифровой термометр, с точностью до 0.3С.
Почему нет? попробую считать температуру, используя софтовый i2c.
Нашел замечательную библиотеку у levap. Вся библиотека состоит из 2х файлов -
Достаточно в i2c_soft.h прописать какие порты пины используются, и почти все заработает. Правда его библиотека под msp-gcc, а я проект делал в Code composer studio.  Поэтому вызов функции nop() пришлось заменить на _nop().
Для линий данных использовал GPIO пин 2.4 а для синхронизации 2.3.

#define I2COUT P2OUT    // Write to Port
#define I2CIN P2IN     // Read from Port
#define I2CDIR P2DIR    // Set Port Direction
#define I2CSEL P2SEL    // Alternative Port Fuctions


#define SDA       BIT4     // Serial Data Line PIN
#define SCL       BIT3     // Serial Clock Line PIN

Потом распаял на макетке датчик температуры, 2 подтягивающих резистора 4.7кОм на Vcc, заземлил выходы датчика A1-A3 (см. даташит).
Вот что получилось:

Снимал телефоном, качество не очень. Но понять что к чему подключено можно. На датчик +5В брал с USB разъема.
Для быстрой смены параметров кристалла использовал Grace - новую визуальную примочку к CCS от TI. Позволяет визуально задавать параметры кристалла (тактирование, пины, USI и т.д.). Неплохая вещь, хотя можно и без нее.
Вот код общения с датчиком:



#define ACCESS_MEM      0x17
#define ACCESS_CONF     0xAC
#define READ_TEMP       0xAA
#define START_CONVERT   0xEE
#define STOP_CONVERT    0x22
#define READ            0x01
#define WRITE           0x00






unsigned int DS1624ReadTemperature(void)
{
    volatile unsigned int temp, ack;
    i2c_Init();
    i2c_Start();
    ack=i2c_Write(0x90); // W=0,R=1 b1001000W 
    ack=i2c_Write(START_CONVERT); 
    while(1)
    {
  i2c_Start();
        ack=i2c_Write(0x90);
        ack=i2c_Write(ACCESS_CONF);
        i2c_Start();
        ack=i2c_Write(0x90);
        if (i2c_Read(0) & 0x80)
            break;
    }
    i2c_Start();
    ack=i2c_Write(0x90);
    ack=i2c_Write(READ_TEMP);
    i2c_Start();
    ack=i2c_Write(0x91);//read
    temp = (unsigned int)i2c_Read(1);//1st byte
   // temp <<= 8;
   // temp |= (unsigned int)i2c_Read(1);//2nd byte. дает точность 0.3С после запятой. Ненадо
   if (temp>125)//если t меньше 0
   {
    temp = 255-temp;
   }
   
    i2c_Stop();
    return temp;
}