Программный SPI для PIC

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Программный SPI для PIC

Сообщение Hispanus »

За неимением на борту своего МК аппаратного spi, но при острой нужде реализовать этот протокол (общение с радиомодулем TR24A), а также нежеланием тратиться на новый чип (например 16f877), я обратился к даташитам. В результате в моём мозгу сложилось устойчивое понимание этого протокола:
-Выделяю три ножки любого порта: для сигнала синхронизации, исходящих данных, входящих данных.
-Мастер, которым является МК, начинает формировать синхроимпульсы, которые принимает Приёмник (в данном случае радиомодуль). При каждом спаде\возрастании этого синхроимпульса, мастер устанавливает ножку исходящих данных в состояние очередного бита данных. В это же время приёмник читает ножку для входящих данных и записывает их в сдвиговый регистр. Так повторяется пока не будет передан\получен целый байт. После того как он получен его значение загружается в буфер, после чего цикл чтения\записи заводится снова.
Поправьте меня, если что то не так :)
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Программный SPI для PIC

Сообщение dosikus »

Hispanus Прием обязателен ?
Если подключать что то типа LCD , прием не нужен . Интерфейс реализуется достаточно просто...
Реклама
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Программный SPI для PIC

Сообщение Hispanus »

Мне нужно организовать обмен между МК и радиомодулем..без приёма думаю никак :) Для синхроимпульсов думаю использовать таймер, а приём и передачу сделать через прерывания...
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Программный SPI для PIC

Сообщение dosikus »

Hispanus писал(а):Мне нужно организовать обмен между МК и радиомодулем..без приёма думаю никак :) Для синхроимпульсов думаю использовать таймер, а приём и передачу сделать через прерывания...
Прием так же можно , тактирование все равно мастер задает .
Пока сделайте без таймеров и прерываний . Может этого вам и хватит.
На чем пишете ?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Программный SPI для PIC

Сообщение Hispanus »

Пишу на Си в PIC C Compile (css). Если не использовать таймеры, откуда взять синхроимпульсы? :) Кварц использую внутренний...МК - pic16f628a.
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Программный SPI для PIC

Сообщение dosikus »

Hispanus писал(а):Пишу на Си в PIC C Compile (css). Если не использовать таймеры, откуда взять синхроимпульсы? :) Кварц использую внутренний...МК - pic16f628a.
Ручками , данные все равно придется так же ручками толкать.
Ничего страшного, скорости хватит . С LCD же работаем на софтовом SPI ...
Реклама
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Программный SPI для PIC

Сообщение Hispanus »

Ну почему ручками..если вход для синхронизации зацепить на ножку RB0\INT, то при каждом новом импульсе будут вызываться прерывание, в обработчике которого и можно будет сделать запись\чтение :)
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Программный SPI для PIC

Сообщение Hispanus »

dosikus писал(а):
Hispanus писал(а):Пишу на Си в PIC C Compile (css). Если не использовать таймеры, откуда взять синхроимпульсы? :) Кварц использую внутренний...МК - pic16f628a.
Ручками , данные все равно придется так же ручками толкать.
Ничего страшного, скорости хватит . С LCD же работаем на софтовом SPI ...
У Вас случайно нет никакого рабочего примера, чтобы можно было подглядеть как другие это делали :)
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Программный SPI для PIC

Сообщение Аlex »

Но синхроимпульсы будет ловить модуль. Зачем их заводить на INT ?
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Программный SPI для PIC

Сообщение Hispanus »

Модуль это и есть главная проблема...В 628 вообще нету ножек, работающих под него..
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Слесарь
Друг Кота
Сообщения: 4769
Зарегистрирован: Ср июл 14, 2010 18:27:52

Re: Программный SPI для PIC

Сообщение Слесарь »

Код: Выделить всё

void spi_io_w( char byte_h, char byte_l )
{

	unsigned char n;

	for( n = 0; n < 8; n++ )
	{
		SCK_PIN = 1;
		if ( byte_h & 0x80 ) /* most sign bit first */
		{
			SDO_PIN = 1;
		}
		else
		{
			SDO_PIN = 0;
		}
		DelayUs( 30 );
		byte_h = ( byte_h << 1 ) | SDI_PIN;
		DelayUs( 30 );
		SCK_PIN = 0;
		DelayUs( 30 );
 	}
	
for( n=0; n < 8; n++ )
	{
		SCK_PIN = 1;
		if ( byte_l & 0x80 ) /* most sign bit first */
		{
			SDO_PIN = 1;
		}
		else
		{
			SDO_PIN = 0;
		}
		DelayUs( 30 );
		byte_l = ( byte_l << 1 ) | SDI_PIN;
		DelayUs( 30 );
		SCK_PIN = 0;
		DelayUs( 30 );
 	}

}

char write_byte( char dat )
{
	char n;
	for( n=0; n < 8; n++ )
	{
		SCK_PIN = 1;
		if ( dat & 0x80 ) /* most sign bit first */
		{
			SDO_PIN = 1;
		}
		else
		{
			SDO_PIN = 0;
		}
		DelayUs( 30 );
		dat = ( dat << 1 ) | SDI_PIN;
		DelayUs( 30 );
		SCK_PIN = 0;
		DelayUs( 30 );
	}

	return( dat );
}

void spi_io_24b( char * p_spi_byte_h, char * p_spi_byte_s, char * p_spi_byte_l )
{
	unsigned char byte_h = 0;
	unsigned char byte_s = 0;
	unsigned char byte_l = 0;
	char n;

	for( n = 0; n < 8; n++ )
	{
		SCK_PIN = 1;
		DelayUs( 30 );
		byte_h = ( byte_h << 1 ) | SDI_PIN;
		DelayUs( 30 );
		SCK_PIN = 0;
		DelayUs( 30 );
 	}

	for( n = 0; n < 8; n++ )
	{
		SCK_PIN = 1;
		DelayUs( 30 );
		byte_s = ( byte_s << 1 ) | SDI_PIN;
		DelayUs( 30 );
		SCK_PIN = 0;
		DelayUs( 30 );
 	}

	for( n=0; n < 8; n++ )
	{
		SCK_PIN = 1;
		DelayUs( 30 );
		byte_l = ( byte_l << 1 ) | SDI_PIN;
		DelayUs( 30 );
		SCK_PIN = 0;
		DelayUs( 30 );
 	}

	*p_spi_byte_l = byte_l;
	*p_spi_byte_s = byte_s;
	*p_spi_byte_h = byte_h;
}
Этот код я использую в промышленном аппарате. Проблем нет. Работа круглосуточная.
Задержки расчитать относительно тактовой частоты процессора и характеристик микросхем.
Последний раз редактировалось Слесарь Ср сен 07, 2011 22:47:42, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Программный SPI для PIC

Сообщение Аlex »

Hispanus писал(а):Модуль это и есть главная проблема...В 628 вообще нету ножек, работающих под него..
Hispanus писал(а):Мне нужно организовать обмен между МК и радиомодулем..
Я про радиомодуль :)
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Программный SPI для PIC

Сообщение Hispanus »

Аlex писал(а):
Hispanus писал(а):Модуль это и есть главная проблема...В 628 вообще нету ножек, работающих под него..
Hispanus писал(а):Мне нужно организовать обмен между МК и радиомодулем..
Я про радиомодуль :)
А Вы про радиомодуль :) Тогда да, незачем..Но формировать то их всё равно надо, правильно же ведь?
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Программный SPI для PIC

Сообщение Аlex »

Формировать естественно надо. Но ловить их будет слейв (радиомодуль).
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Программный SPI для PIC

Сообщение Hispanus »

Слесарь писал(а):

Код: Выделить всё

void spi_io_w( char byte_h, char byte_l )
{

	unsigned char n;

	for( n = 0; n < 8; n++ )
	{
		SCK_PIN = 1;
		if ( byte_h & 0x80 ) /* most sign bit first */
		{
			SDO_PIN = 1;
		}
		else
		{
			SDO_PIN = 0;
		}
		DelayUs( 30 );
		byte_h = ( byte_h << 1 ) | SDI_PIN;
		DelayUs( 30 );
		SCK_PIN = 0;
		DelayUs( 30 );
 	}
	
for( n=0; n < 8; n++ )
	{
		SCK_PIN = 1;
		if ( byte_l & 0x80 ) /* most sign bit first */
		{
			SDO_PIN = 1;
		}
		else
		{
			SDO_PIN = 0;
		}
		DelayUs( 30 );
		byte_l = ( byte_l << 1 ) | SDI_PIN;
		DelayUs( 30 );
		SCK_PIN = 0;
		DelayUs( 30 );
 	}

}

char write_byte( char dat )
{
	char n;
	for( n=0; n < 8; n++ )
	{
		SCK_PIN = 1;
		if ( dat & 0x80 ) /* most sign bit first */
		{
			SDO_PIN = 1;
		}
		else
		{
			SDO_PIN = 0;
		}
		DelayUs( 30 );
		dat = ( dat << 1 ) | SDI_PIN;
		DelayUs( 30 );
		SCK_PIN = 0;
		DelayUs( 30 );
	}

	return( dat );
}

void spi_io_24b( char * p_spi_byte_h, char * p_spi_byte_s, char * p_spi_byte_l )
{
	unsigned char byte_h = 0;
	unsigned char byte_s = 0;
	unsigned char byte_l = 0;
	char n;

	for( n = 0; n < 8; n++ )
	{
		SCK_PIN = 1;
		DelayUs( 30 );
		byte_h = ( byte_h << 1 ) | SDI_PIN;
		DelayUs( 30 );
		SCK_PIN = 0;
		DelayUs( 30 );
 	}

	for( n = 0; n < 8; n++ )
	{
		SCK_PIN = 1;
		DelayUs( 30 );
		byte_s = ( byte_s << 1 ) | SDI_PIN;
		DelayUs( 30 );
		SCK_PIN = 0;
		DelayUs( 30 );
 	}

	for( n=0; n < 8; n++ )
	{
		SCK_PIN = 1;
		DelayUs( 30 );
		byte_l = ( byte_l << 1 ) | SDI_PIN;
		DelayUs( 30 );
		SCK_PIN = 0;
		DelayUs( 30 );
 	}

	*p_spi_byte_l = byte_l;
	*p_spi_byte_s = byte_s;
	*p_spi_byte_h = byte_h;
}
Этот код я использую в промышленном аппарате. Проблем нет. Работа круглосуточная.
Задержки расчитать относительно тактовой частоты процессора и характеристик микросхем.
Еще бы разобраться теперь, Спасибо :)
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Программный SPI для PIC

Сообщение Jack_A »

Не знаю как у пиков, но вообще для SPI еще сигнал CS нужен.
Я когда-то по молодости сдуру CS слейва напостоянно на 0 посадил. И работало ! Но когда туда случайно ( помеха или что еще ) попадал импульс, он продолжал сдвигать на 1 бит всю последующую инфу, получалось в байте 7 бит - егоные, а 1 - из чужого байта.
Брр... Как меня начальство терпело !
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Программный SPI для PIC

Сообщение Hispanus »

Например, если в роли этого формирователя я возьму таймер2, тогда очередной бит я буду толкать после каждого его вызова, начиная со второго..так? :)
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Программный SPI для PIC

Сообщение Hispanus »

Теоретически SPI и на трёх линиях работать должен по моему, но я могу ошибаться :)
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Программный SPI для PIC

Сообщение Аlex »

Вам же уже посоветовали - попробуйте для начала запустить без таймеров и прерываний. Потом уже, если будет необходимо (я например не вижу в этом необходимости) , сделаете на таймерах.
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Программный SPI для PIC

Сообщение Hispanus »

Попробую без таймеров..
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Ответить

Вернуться в «PIC»