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

воскресенье, 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;
}






среда, 9 февраля 2011 г.

Средства разработки MSP430 для Ubuntu Linux 10.04 -10.10


Так исторически сложилось, что я очень не люблю операционную систему Windows. Во всех ее проявлениях. О причинах этого можно говорить долго и увлекательно, но не будем :)
К сожалению два основных средства разработки для MSP430 - Code Composer studio и IAR Kickstart не поддерживают Linux :(
Впрочем от CCS мы, наверное, этого и дождемся со временем - начиная с 4 версии он переехал на платформу Eclipse. Осталось портировать компилятор.
Но есть и альтернатива - mspgcc. Бесплатная... Delicious.
Из разных источников [1] [2] [3] я собрал рецепт сборки рабочей среды для Ubuntu.
Итак, приступим
Для начала установим необходимые библиотеки и компилятор gcc


sudo aptitude install git-core gcc-4.4 texinfo patch libncurses5-dev zlibc zlib1g-dev libx11-dev libusb-dev libreadline6-dev


Качаем порт mspgcc для gcc4 отсюда
или вводим команды, чтобы взять из репозитария git (на работе git не смог пробиться через прокси, а дома все ОК)


git clone git://mspgcc4.git.sourceforge.net/gitroot/mspgcc4/mspgcc4


Если скачали архив, то распаковываем его в домашнюю директорию. Переименуйте папку mspgcc4-20110130 в mspgcc4.

cd mspgcc4 && perl buildgcc.pl


Запуститься скрипт сборки. На все вопросы можно жать Enter (по умолчанию) кроме вопроса о сборке - там нужно ввести "y" чтобы процесс сборки запустился. Также спрашивает ставить ли Insight - древний деббагер - можно сказать n, тем более что с ним бывают проблемы при сборке.
Можно попить кофе пока идет сборка.
После сборки в /opt появиться папочка msp-gcc-4.4.5. Неплохо бы сделать симлинк 


sudo ln -s  msp430-gcc-4.4.5/ mspgcc


и добавить его в path. Теперь можно компилировать, например,


msp430-gcc -Os -mmcu=msp430x2231 -o led.elf led.c


led.c, например, такой:



01./* Пример моргания диодом */
02. 
03.#include <msp430g2231.h>
04. 
05./** Задержка. **/
06.delay(unsigned int d) {
07.int i;
08.for (i = 0; i<d; i++) {
09.nop();
10.}
11.}
12. 
13.int main(void) {
14.WDTCTL = WDTPW | WDTHOLD;// отключаем Watchdog таймер
15.P1DIR = 0xFF;
16.P1OUT = 0x01;
17. 
18.for (;;) {
19.P1OUT = ~P1OUT;
20.delay(0x4fff);
21.}
22.}



Если программа собрана без ошибок, то можно ее заливать в контроллер. Для этого нам пригодиться программа mspdebug



tar -zxvf mspdebug.tar.gz
cd mspdebug
make
sudo make install


Чтобы можно было работать с LaunchPad не из под root, нужно задать udev правило.


sudo nano /etc/udev/rules.d/46-TI_launchpad.rules


Вписываем туда :


ATTRS{idVendor}=="0451", ATTRS{idProduct}=="f432", MODE="0660", GROUP="plugdev"


Перезапускаем udev:


sudo restart udev

Подключите Launchpad. 



mspdebug rf2500
prog led.elf

run



Программа прошьется в контроллер и плата заморгает красным глазком...