Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Компьютерное железо
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2009, 19:02   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию i2c + RS-232

Добрый вечер.
Вообщем в кратце, разработали девайс - бегущая строка. Набор матрицы и микросхем (16 бит i2c) подцеплины на шину i2c. У меня RTS - это SCL, DTR - SDA. Теперь надо программно слать комманды START, STOP, выборка девайса (их 8, поэтому 7 битная адресация устраивает), данные (ну байт, на включение определенного диода, пока не важно, хоть какой-нибудь загорелся бы). Собственно, вопрос, почитал i2c вроде написал код, но может кто-то уже имеет опыт подобный, и скажет (ткнет носом) где и как лучше/верней формировать данные.

Спасибо.

Visual C++
Код:
#include <windows.h>
#include <stdio.h>

#define i2c_scl(enable) dcb.fRtsControl = (((enable) == 1) ? RTS_CONTROL_ENABLE : RTS_CONTROL_DISABLE)
#define i2c_scl_sync() dcb.fRtsControl = ((dcb.fRtsControl == RTS_CONTROL_ENABLE) ? RTS_CONTROL_DISABLE : RTS_CONTROL_ENABLE)
#define i2c_sda(enable) dcb.fDtrControl = (((enable) == 1) ? DTR_CONTROL_ENABLE : DTR_CONTROL_DISABLE)
#define i2c_set() SetCommState(hCom, &dcb); Sleep(5);
#define i2c_write(b) ((b << 1) | 0)
#define i2c_read(b) ((b << 1) | 1)
#define i2c_get_bit(b, n) ((b >> (n - 1)) & 1)

#define i2c_start() \
	i2c_scl(1); \
	i2c_sda(1); \
	i2c_set(); \
	i2c_scl(1); \
	i2c_sda(0); \
	i2c_set();

#define i2c_stop() \
	i2c_scl(1); \
	i2c_sda(0); \
	i2c_set(); \
	i2c_scl(1); \
	i2c_sda(1); \
	i2c_set();

void i2c_send(HANDLE hCom, DCB &dcb, unsigned char b)
{
	printf("%x: ", b);
	for(int i = 8; i > 0; i--)
	{
		printf("%d", i2c_get_bit(b, i));
		i2c_scl(0);
		i2c_sda(i2c_get_bit(b, i));
		i2c_set();
		i2c_scl(1);
		i2c_set();
	}
	
	// ACK ?
	i2c_scl(0);
	i2c_set();

	DCB dcbRet;
	dcbRet.DCBlength = sizeof(DCB);
	/*for(;;)
	{
		i2c_scl_sync();
		i2c_set();
*/
		GetCommState(hCom, &dcbRet);
		//if(!((dcbRet.fRtsControl == RTS_CONTROL_ENABLE) && (dcbRet.fDtrControl == DTR_CONTROL_DISABLE)))
		/*{
			break;
		}
	}*/

	printf("  scl = %d, sda = %d\n", dcbRet.fRtsControl, dcbRet.fDtrControl);
}

int main()
{
	wchar_t buff[1024];
	HANDLE hCom;
	DCB dcb = {0};
	COMMTIMEOUTS commTimeouts = {0};

	hCom = CreateFile(L"COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
	if(hCom == INVALID_HANDLE_VALUE)
	{
		wprintf(L"Error: cannot open %s\n", buff);
	}

	dcb.DCBlength = sizeof(DCB);
	GetCommState(hCom, &dcb);
	dcb.BaudRate = CBR_19200;
	dcb.fParity = FALSE;
	dcb.fOutxCtsFlow = FALSE;
	dcb.fOutxDsrFlow = FALSE;
	dcb.fDtrControl = DTR_CONTROL_DISABLE;
	dcb.fDsrSensitivity = FALSE;
	dcb.fOutX = FALSE;
	dcb.fInX = FALSE;
	dcb.fRtsControl = RTS_CONTROL_DISABLE;
	dcb.fAbortOnError = FALSE;
	dcb.ByteSize = 8;
	dcb.Parity = NOPARITY;
	dcb.StopBits = ONESTOPBIT;
	BOOL ret = SetCommState(hCom, &dcb);
	if(!ret)
	{
		CloseHandle(hCom);
		wprintf(L"Error: cannot setup state 1 for %s\n", buff);
	}
	GetCommTimeouts(hCom, &commTimeouts);
	commTimeouts.ReadIntervalTimeout = MAXDWORD;
	SetCommTimeouts(hCom, &commTimeouts);

	for(;;)
	{
		i2c_start();

		i2c_send(hCom, dcb, i2c_write(0)); // ack: scl = 0, sda = 0
		i2c_send(hCom, dcb, 0x1); // ack: scal = 0, sda = 1
		// i2c_send(hCom, dcb, 0x2); // ack: scal = 0, sda = 0

		i2c_stop();
	}

	CloseHandle(hCom);

	return 0;
}

Последний раз редактировалось BOBAH13; 22.12.2009 в 23:14.
BOBAH13 вне форума Ответить с цитированием
Старый 22.12.2009, 19:30   #2
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Цитата:
и скажет (ткнет носом) где и как лучше/верней формировать данные.
Не понял суть вопроса. В смысле как сделать интерфейс между компом (rs-232) и i2c? тут без дополнительных микрух не обойтись, имхо.
Вот тут можно посмотреть:
http://www.gedanken.demon.co.uk/rs23...rters/i2c.html
сделано на простеньком восьми лаповом микроконтроллере.
Вот еще ссыль:
http://www.taretronics.com/I2CtoRS232Adapter.html
Levsha100 вне форума Ответить с цитированием
Старый 22.12.2009, 20:34   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Разве не выйдет на порт слать данные ? В цикле слать старт - адрес - данные - стоп...и так постоянно... так ведь можно думаю зажечь ченить ) щас уже не осталось времени еще и контроллер цеплять.
BOBAH13 вне форума Ответить с цитированием
Старый 22.12.2009, 21:52   #4
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Стоп, я подумал что на компе аппаратный rs-232- забыл что можно свободно устанавливать биты, сори.
Levsha100 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
GPRS modem (RS 232) Виталь Общие вопросы Delphi 4 26.12.2008 04:30
RS-232 интерфейс SLIMMUS Общие вопросы Delphi 2 07.09.2008 23:32
Assembler. Разработать устройство которое считывает из EEPROM типа 24С512 по интерфейсу I2c информацию KEDDDD Фриланс 1 02.09.2008 02:53
Последовательный порт RS-232 LepihinMS Общие вопросы Delphi 4 23.06.2007 00:53
работа с Ft245/232 на Delphi dima00 Win Api 8 06.04.2007 23:55