Подключение трансивера к контролеру по SPI интерфейсу

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
PeLenG_333
Родился
Сообщения: 9
Зарегистрирован: Пн апр 02, 2012 13:42:15

Подключение трансивера к контролеру по SPI интерфейсу

Сообщение PeLenG_333 »

Помогите пожалуйста. Нам необходимо запрограммировать передачу и прием данных от RFM 22 433 D на контролер M16C.
Я скачал проги - но ни одна правильно не работает, хоть и все перелопатил. Если у кого-то завалялась прога под передачу и прием по SPI - пришлите пожалста. Или скажите где выкачать. Ну или хотябы подскажите советом. Спасибо.
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Подключение трансивера к контролеру по SPI интерфейсу

Сообщение Jack_A »

PeLenG_333 писал(а):RFM 22 433 D на контролер M16C.

Щас все брошу и начну искать доку на RFM 22 433 D и контролер M16C

Хотя, может быть, у кого-то закрома прям ломятся от RFM 22 433 D и контролеров M16C
Реклама
PeLenG_333
Родился
Сообщения: 9
Зарегистрирован: Пн апр 02, 2012 13:42:15

Re: Подключение трансивера к контролеру по SPI интерфейсу

Сообщение PeLenG_333 »

Если вы такой умный (или решили повыпендриваться от нечего делать), то не пишите и не смотрите вообще сюда.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Подключение трансивера к контролеру по SPI интерфейсу

Сообщение Jack_A »

Я не умный, я добрый :) Хочу помочь чайнику сформулировать вопрос так, чтоб всем захотелось ему ответить. А чайник в ответ - грубит. Никто не полезет в инет разыскивать эти таинственные дивайсы, а если спрашивающий выложит схему: это у меня на входе, это - на выходе, это я попробовал - но не выходит -- мудрые коты поправят и научат.
Реклама
Эиком - электронные компоненты и радиодетали
PeLenG_333
Родился
Сообщения: 9
Зарегистрирован: Пн апр 02, 2012 13:42:15

Re: Подключение трансивера к контролеру по SPI интерфейсу

Сообщение PeLenG_333 »

Приношу извинения. Вот схемка. Это нужно запрограммировать для пакетной передачи на С.
Вложения
Схемка.png
(174.6 КБ) 434 скачивания
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Подключение трансивера к контролеру по SPI интерфейсу

Сообщение Jack_A »

Вот совсем другой коленкор.
Я, к сожалению, с Ренесасовскими МК дел не имел и на Си для МК не пишу. Можем обсудить общие положения.
Если определен тип МК и компилятор к нему, очевидно, есть документация на этот компилятор. Если в ней есть библиотеки для SPI, проблем быть не должно, если нет - алгоритм достаточно простой.
1. Инициализируем порт для работы в режиме SPI, т.к. судя по схеме, эти выводы могут работать и в других режимах ( UART ).
2. Переводим линию CS в низкий уровень.
3. В регистр данных загружаем передаваемый байт.
4. Дожидаемся окончания передачи байта и идем на п.3.
5. Когда все байты переданы, переводим линию CS в высокий.

Если требуется и что-то принимать, то после п. 4 считываем из регистра данных байт, принятый от вн.устройства.

Вот приблизительно в таком разрезе. Но по 16-битным тут, кажется, немногие спецы - самые отъявленные из гуру. Может быть, помогут. Я -- пас. Честно - если бы мне это понадобилось - я бы повесился. Сложный МК, на первый взгляд, по сравнению с детской простотой AVR.
Реклама
PeLenG_333
Родился
Сообщения: 9
Зарегистрирован: Пн апр 02, 2012 13:42:15

Re: Подключение трансивера к контролеру по SPI интерфейсу

Сообщение PeLenG_333 »

Спасибо за консульнацию! :lol: У нас просто отладочный набор именно с этим контроллером. Ничего не поделаешь.
Аватара пользователя
BigallS
Опытный кот
Сообщения: 752
Зарегистрирован: Пт апр 15, 2011 21:11:22
Откуда: Россия

Re: Подключение трансивера к контролеру по SPI интерфейсу

Сообщение BigallS »

Недавно поднималась тема на подобные модули http://radiokot.ru/forum/viewtopic.php? ... ilit=RFM22 посмотрите
PeLenG_333
Родился
Сообщения: 9
Зарегистрирован: Пн апр 02, 2012 13:42:15

Re: Подключение трансивера к контролеру по SPI интерфейсу

Сообщение PeLenG_333 »

среда разработки для Renesas M16C6C - HEW - сгенерировала мне код для SPI, но я не могу в нем разобраться куда дописывать свои функции для принятия и отправки данных на трансивер RFM22. Помогите пожалуйста разобраться. Хотя бы, куда нужно что писать.
Заранее благодарен!!

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

/******************************************************************************
* DISCLAIMER:
* The software supplied by Renesas Technology Europe Ltd is
* intended and supplied for use on Renesas Technology products.
* This software is owned by Renesas Technology Europe, Ltd. Or
* Renesas Technology Corporation and is protected under applicable
* copyright laws. All rights are reserved.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS,
* IMPLIED OR STATUTORY, INCLUDING BUT NOT LIMITED TO IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* APPLY TO THIS SOFTWARE. RENESAS TECHNOLOGY AMERICA, INC. AND
* AND RENESAS TECHNOLOGY CORPORATION RESERVE THE RIGHT, WITHOUT
* NOTICE, TO MAKE CHANGES TO THIS SOFTWARE. NEITHER RENESAS
* TECHNOLOGY AMERICA, INC. NOR RENESAS TECHNOLOGY CORPORATION SHALL,
* IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES FOR ANY REASON WHATSOEVER ARISING OUT OF THE
* USE OR APPLICATION OF THIS SOFTWARE.
******************************************************************************/

/* Copyright (C) 2008. Renesas Technology Europe, All Rights Reserved */

/*””FILE COMMENT””******************************* Technical reference data ****
* File Name		: main_serial_spi.c
* Version 		: 1.00
* Device 		: M16C/6C (R5F36CAMDFB)
* Tool Chain 	: HEW, NC30 V5.44
* H/W Platform	: RSKM16C6C
* Description 	: Demonstration of M16c6c on-chip Serial Interface (SIO3/SIO4)
*
* Operation: 	1. Make the following connections on RSKM16C6C -
*					a. 	CPU port pin - p6_1 (J2-5) -> P7_2 (J1-26)			
*			  		b. 	CPU port pin - p6_2 (J2-4) -> p7_0 (J1-28)
*					c.  CPU port pin - p6_3 (J2-3) -> p7_1 (J1-27)
*			    2. Build this application and download it to the target.
*			    3. Click on the "Reset Go" icon available on 'Debug' toolbar.
*				4. The debug LCD will display the message "SPI-COMM".
*				5. A string "Renesas" will be transmitted from UART0
*				   to serial port UART2.
*				6. The string received by UART2 will be displayed on the
*				   debug LCD.
*				7. The user can also examine the string received by UART2 in
*				   the variable "c_RecBuff" using HEW C watch window.
*  Note: This file contains a compiler directive "#pragma interrupt 
*  functionname" which instructs the compiler to treat the following 
*  function as an interrupt. The compiler will save all registers
*  used in the function and replace the normal RTS instruction with an RTE
*  instruction at the end of the function.
*
******************************************************************************/

/******************************************************************************
* History 		: 30.10.2008 Ver. 1.00 First Release
*””FILE COMMENT END””*********************************************************/

/******************************************************************************
User Includes (Project level includes)
******************************************************************************/
/*	Following header file provides a structure to access on-chip I/O
    registers. */
#include "sfr6c.h"
/* Following header file provides common defines for widely used items. */
#include "rskm16c6cdef.h"
/*	Following header file provides useful macros and function prototypes for
	controling the LCD interface.	*/
#include "lcd.h"
/*	Following header file provides prototypes for the functions defined in this
	file.	*/
#include "main_serial_spi.h"

/*******************************************************************************
Constants
*******************************************************************************/
/* Constant data to be transmitted	*/
const char c_data[8] = "Renesas";

/*******************************************************************************
Global Variables
*******************************************************************************/
/* Buffer to store the received data	*/
volatile char c_RecBuff[8];

/*******************************************************************************
User Program Code
*******************************************************************************/

/*””FUNC COMMENT””**************************************************************
* Outline 		: main
* Description 	: Main program 
* Argument  	: none
* Return value  : none
*””FUNC COMMENT END””**********************************************************/

void main(void)				
{
	/* Used as a loop counter	*/
	unsigned char i;
	/* Used to generate delay	*/
	unsigned short dly;

	/* Reset the LCD module */
	InitialiseDisplay();

	/* Display Renesas Splash Screen */
	DisplayString(LCD_LINE1,APP_NAME);
	
	/*	Enable writing to register pclk register */
	prc0 =1;

	/*	Select f1 as a clock source to SIO3/4 */
	pclk0=0;

	/*	Disable writing to register pclk register */
	prc0 =0;
	
	/* Configure UART0 for transmission	*/
	SPI_Master_init();
	
	/* Configure UART2 for reception	*/
	SPI_Slave_init();
	
	/* Enable interrupts	*/
	ENABLE_IRQ

	/* This loop transmits all chracters contained in the 'c_data' buffer 	*/
	for (i=0; i<sizeof(c_data); i++)
	{
		while(ti_u0c1 == 0)
		{
			/* wait for previous transmission to complete */
		}	 		 

 		/* Load the data to be transmitted, in the transmit buffer */
		u0tb = (unsigned short) c_data[i];

		for (dly=0xffffU; dly>0; dly--)
		{
			/* Delay */			  		
		} 
	}

	/*	Display the received string on the second line of the debug LCD. */
	DisplayString(LCD_LINE2,c_RecBuff);

	/* This loop should never exit.	*/
	while (1);
}         
/******************************************************************************
End of function main
******************************************************************************/

/*””FUNC COMMENT””**************************************************************
* Outline 		: SPI_Master_init
* Description 	: Configures UART0 in transmit mode
* Argument  	: none
* Return value  : none
*””FUNC COMMENT END””**********************************************************/

void SPI_Master_init(void) 
{
	/* Port pin configuration */
	/* Configure the port pin p6_1 (CLK0) as output.	*/
	pd6_1 = 1;
	/* Configure the port pin p6_3 (TXD0) as output.	*/	
	pd6_3 = 1;
	/* Configure the port pin p6_1 (RXD0) as input.	*/
	pd6_2 = 0;
	
	/* Clock select */
	uclksel0 = 0x00;

	/*	Enable writing to register pclk register */
	prc0 =1;

	/*	Select f1SIO as a clock source to UART0-UART2 */
	pclk1=1;

	/*	Disable writing to register pclk register */
	prc0 =0;

	/* Set master clock bit rate */
	u0brg = (unsigned char)(((f1_CLK_SPEED)/(BIT_RATE))-1);

	/* UART0 transmit/receive mode register 
	  b2:b0	- SMD12:SMD1 - 001 (Synchronous Serial Mode selected)
   	  b3	- CKDIR		 - 0 (Internal clock selected)
   	  b4	- STPS		 - 0 (1 Stop bit)
   	  b5	- PRY		 - 0 (No parity used)
   	  b6	- PRYE		 - 0 (No parity used)
  	  b7	- IOPOL		 - 0 (TXD, RXD polarity not inverted) 	*/
		
	u0mr = 0x01;
	   
	/* UART0 transmit/receive control register 0 
	  b1:b0	- CLK01:CLK0 - 0 (U0BRG count source select bits -f1SIO or f2SIO selected)
   	  b2 	- CRS 		 - 0 (CTS/RTS function select bit (Set to 0))
  	  b3	- TXEPT		 - 0 (Clear transmit register empty flag)
   	  b4	- CRD		 - 1 (Disable CTS/RTS function)
   	  b5	- NCH		 - 0 (CMOS Data output selected)
   	  b6	- CKPOL		 - 1 (Transmit data is output at the rising edge of
	  						  transmit/receive clock and receive data is input at
							  the falling edge.
  	  b7	- UFORM		 - 1 (MSB first selected) */
		
  	u0c0 = 0xd0; 		

	/* UART0 transmit/receive control register 1 
	b0 		- TE		- 1 (Enable transmission)	
	b1	 	- TI 		- 0 (Clear the 'transmit buffer empty' flag)
	b2 		- RE 		- 1 (Enable reception)
	b3 		- RI		- 0 (Clear the 'Receive complete' flag)
	b5:b4 	- Reserved  - 0 
	b6		- UOLCH		- 0 (non-inverse data logic selected)
	b7		- UOERE		- 0 (Error signal output disable) */
		
  	u0c1 = 0x05; 	

	/* Unused in synchronous serial mode. Set to 0.	*/
	u0smr = 0x00;

	/* Unused in synchronous serial mode. Set to 0.	*/	
	u0smr2 = 0x00;

	/* UARTi Special Mode Register 3
	   Bit b3 - NODC - Set to 0 in order to select 'CLKi is CMOS output' 
	   Remaining bits are not applicable in synchronous serial mode. Set to 0.	*/	
	u0smr3 = 0x00;

	/* Unused in synchronous serial mode. Set to 0.	*/
	u0smr4 = 0x00;

	/* Select 'Transmit buffer empty' as an interrupt source for UART0 transmit
	   interrupt.	*/
	ucon |= 0x01;

	/* Interrupt Control Register for UART0 transmit
	b2:b0 	- ILVL2:ILVL0 	- 011 (Interrupt priority 3 selected for UART0
								   transmit)
	b3 		- IR		 	- 0 (Interrupt request bit. Set to 0)
	b4 		- POL 			- 0 (Polarity select bit. Set to 0.)  
	b5 		- Reserved		- 0
	b7:b6 	- Reserved		- 0 		*/
		
	s0tic = 0x03;
}
/******************************************************************************
End of function SPI_Master_init
******************************************************************************/

/*””FUNC COMMENT””**************************************************************
* Outline 		: SPI_Slave_init
* Description 	: Configures UART2 in receive mode
* Argument  	: none
* Return value  : none
*””FUNC COMMENT END””**********************************************************/

void SPI_Slave_init(void) 
{
	/* Port pin configuration */
	/* Configure the port pins as follows -
		 p7_0 (TXD2) - output
		 p7_1 (RXD2) - input
		 p7_2 (CLK2) - output	*/	
	pd7 = 0x09;

	/* Set master clock bit rate */
	u2brg = (unsigned char)(((f1_CLK_SPEED)/(BIT_RATE))-1);

	/* UART2 transmit/receive mode register 
	  b2:b0	- SMD12:SMD1 - 001 (Synchronous Serial Mode selected)
   	  b3	- CKDIR		 - 1 (External clock selected)
   	  b4	- STPS		 - 0 (1 Stop bit)
   	  b5	- PRY		 - 0 (No parity used)
   	  b6	- PRYE		 - 0 (No parity used)
  	  b7	- IOPOL		 - 0 (TXD, RXD polarity not inverted) 	*/
	  
	 u2mr = 0x09;

	/* UART2 transmit/receive control register 0 
	  b1:b0	- CLK01:CLK0 - 0 (U2BRG count source select bits -f1SIO or f2SIO
	  						  selected)
   	  b2 	- CRS 		 - 0 (CTS/RTS function select bit (Set to 0))
  	  b3	- TXEPT		 - 0 (Clear transmit register empty flag)
   	  b4	- CRD		 - 1 (Disable CTS/RTS function)
   	  b5	- NCH		 - 0 (CMOS Data output selected)
   	  b6	- CKPOL		 - 1 (Transmit data is output at the rising edge of
	  						  transmit/receive clock and receive data is input
							  at the falling edge.
  	  b7	- UFORM		 - 1 (MSB first selected) */
	  
  	u2c0 = 0xd0; 		

	/* UART0 transmit/receive control register 1 
	b0 		- TE		- 1 (Enable transmission)	
	b1	 	- TI 		- 0 (Clear the 'transmit buffer empty' flag)
	b2 		- RE 		- 1 (Enable reception)
	b3 		- RI		- 0 (Clear the 'Receive complete' flag)
	b4		- U2lRS	 	- 0	(UART2 transmit interrupt source - U2TB
							 register empty)
	b5 		- U0RRM  	- 1 (Continuous receive mode enabled) 
	b6		- UOLCH		- 0 (non-inverse data logic selected)
	b7		- UOERE		- 0 (Error signal output disable) */
	
  	u2c1 = 0x25; 	

	/* Unused in synchronous serial mode. Set to 0.	*/
	u0smr = 0x00;

	/* Unused in synchronous serial mode. Set to 0.	*/	
	u0smr2 = 0x00;

	/* UARTi Special Mode Register 3
	   Bit b3 - NODC - Set to 0 in order to select 'CLKi is CMOS output' 
	   Remaining bits are not applicable in synchronous serial mode. Set to 0.	*/	
	u0smr3 = 0x00;

	/* Unused in synchronous serial mode. Set to 0.	*/
	u0smr4 = 0x00;

	/* Interrupt Control Register for UART2 receive
	b2:b0 	- ILVL2:ILVL0 	- 101 (Interrupt priority 5 selected for UART2
								   transmit)
	b3 		- IR		 	- 0 (Interrupt request bit. Set to 0)
	b4 		- POL 			- 0 (Polarity select bit. Set to 0.)  
	b5 		- Reserved		- 0
	b7:b6 	- Reserved		- 0 		*/
	
	s2ric = 0x05;
	
	/* Dummy write to UART2 receive & transmit register	*/
	u2rb = 0x00U;
	u2tb = 0x00U;
}
/******************************************************************************
End of function SPI_Slave_init
******************************************************************************/

/*””FUNC COMMENT””**************************************************************
* Outline 		: _uart0_transmit
* Description 	: Interrupt handler for UART0 transmit
* Argument  	: none
* Return value  : none
*””FUNC COMMENT END””**********************************************************/

#pragma interrupt	_uart0_transmit(vect=17)
void _uart0_transmit(void)
{
	/* Clear the 'transmission complete' flag.	*/
	ir_s0tic = 0;
}
/******************************************************************************
End of ISR _uart0_transmit
******************************************************************************/

/*””FUNC COMMENT””**************************************************************
* Outline 		: _uart2_receive
* Description 	: Interrupt handler for UART2 receive
* Argument  	: none
* Return value  : none
*””FUNC COMMENT END””**********************************************************/

#pragma interrupt	_uart2_receive(vect=16)
void _uart2_receive(void)
{
	/* Used to reference a specific location in the array while string the
	   received data.	*/	
	static unsigned char uc_cnt;
	
	/* Copy the received data to the global variable 'c_RecBuff'	*/
	c_RecBuff[uc_cnt] = (char)u2rb ;
	
	/* Dummy write to the receive register to reinitiate a receive operation.	*/
	u2rb = 0x00;
	
	/* Check if the buffer size is exceed. If it is then reset the 'uc_cnt'
	   variable.	*/
	if(uc_cnt++ >= sizeof(c_RecBuff))
	{
		/* Reinitialize the buffer reference.	*/
		uc_cnt = 0;	
	}

	/* Clear the 'transmission complete' flag.	*/	
	ir_s2ric = 0;
}
/******************************************************************************
End of ISR _uart2_receive
******************************************************************************/
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»