Возник на горизонте один проект, в котором было решено использовать новые контроллеры с продвинутым Сигма-дельта АЦП 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;
}
Заказал у TI some Free samples и попросил заказчика купить небольшую партию для установочного производства... Срок поставки 3 недели. Решил пока поэксперементировать с недавно пришедшими по FedEx
Проблема у 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;
}
имхо определять функции/макросы для доступа к выводам и задержек - более универсально, так как не зависит от архитектуры контроллера:
ОтветитьУдалитьhttp://pastebin.com/5j002yVL
конечно, было бы хорошо создать нормальную библиотеку под это дело... Но задача решена, и нужно двигаться дальше... Более того, даже под аппаратный i2c самой TI лень делать библиотеку - и форумы полны криков как реализовать повторный старт и acknoledge... Для тех кто уже прошел этот путь, это неинтересно, для тех кто еще нет - те еще не могут этого сделать.
ОтветитьУдалить