logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Obsługa 86RF230 ver.B w Messhnetics ZDM-A1281

cyrus1 08 Kwi 2010 22:05 651 0
REKLAMA
  • #1 7937200
    cyrus1
    Poziom 10  
    Mam kod do obsługi 86rf230 ver.A, czy ktoś mógłby pomóc wprowadzić zmiany by program był kompatybilny z układem rf230 ver.B. Oba układy były stosowane w modułach Messhneticsa ZDM-A1281 (ver.A), ATZB-A24-UFLR (ver.B).


    #include <avr/io.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "rf.h"
    #include "spi.h"
    
    
    #define BUFSIZE 272
    #define TRXBUFSIZE 128
    
    unsigned char state;
    unsigned char receiveinprogres;
    rx_frame_t rx_frame;	
    
    unsigned char transmitInProgress;
    
    
    #define CMDTRX_TX_START 0x02
    #define CMDTRX_FORCE_TRX_OFF 0x03 
    #define CMDTRX_RX_ON 0x06 
    #define CMDTRX_TRX_OFF 0x08
    #define CMDTRX_PLL_ON 0x09
    
    
    
    void  sleep() {
    	int i;
    	for(i=0;i<2000;i++) {
    		asm("nop");
    	}	
    }
    
    void  initRF() {
    
    
    	PORTA &=  ~(1<<7);	
    	sleep();
    	sleep();
    	sleep();
    	sleep();
    	PORTA |=  (1<<7);	
    	sleep();
    	sleep();
    	sleep();
    	sleep();
    		
    	receiveinprogres = 0;
    	transmitInProgress = 0;
    	writeRegister(2,CMDTRX_FORCE_TRX_OFF);	
    	sleep();	
    	writeRegister(2,CMDTRX_TRX_OFF);	
    	sleep();		
    	writeRegister(2,CMDTRX_RX_ON);		
    	sleep();	
    	setChannel(0x14);
    }
    
    unsigned char  getChannel() {
    	unsigned char resuult;
    	resuult = readRegister(8);
    	return  (resuult&0x1f);
    }
    
    
    void  setChannel(unsigned char channel) {
    	writeRegister(8,(0x20|(channel &0x1f)));
    }
    
    int sendFrame(unsigned char* frame) {
    	unsigned char reg;	
    	unsigned char bufbin[BUFSIZE];		
    	int sizebufbin;
    	
    	int counter;	
    
    	counter	= 0;
    	while(1) {
    		reg = readRegister(2);
    		if (reg == CMDTRX_RX_ON) 
    			break;
    		if (reg == CMDTRX_TRX_OFF) 
    			break;
    		sleep();			
    		counter++;
    		if (counter>200)
    		  return 0;
    	}
    	
    	counter	= 0;
    	writeRegister(2,CMDTRX_PLL_ON);		
    	while(1) {
    		reg = readRegister(2);
    		if (reg != CMDTRX_PLL_ON) {
    			counter++;
    			if (counter>200)
    				return 0;
    
    			sleep();
    			writeRegister(2,CMDTRX_PLL_ON);		
    		}
    		else 
    			break;
    	}
    
    	sizebufbin = strlen(frame) / 2;
    	if (sizebufbin<=TRXBUFSIZE) {
    		ascii_to_byte(frame,sizebufbin,bufbin);
    		//frame_write(frame,strlen(frame));
    		frame_write(bufbin,sizebufbin);
    		sleep();	
    		writeRegister(2,CMDTRX_TX_START);			
    		transmitInProgress = 1;
    	}
    		
    	return 0;
    }
    
    
    void stepRF() {
    	unsigned char output[BUFSIZE];		
    	unsigned char payload[BUFSIZE];			
    	unsigned char reg;		
    
    	state = readRegister(0x0f);
    	if (state!=0) {
    		sprintf(output,"state(%2x)\r\n",state);		 		
    		uart_putstr(1,output);						
    
    		if (transmitInProgress) {
    			if ((state & 0x08)!=0) {			
    				transmitInProgress = 0;
    				writeRegister(2,CMDTRX_RX_ON);					
    			}
    		}
    		else {
    			if ((state & 0x04)!=0) {
    				receiveinprogres = 1;
    			}
    			if (((state & 0x08)!=0)&&(receiveinprogres)) {			
    				// frame odebrany 
    				receiveinprogres = 0;
    				frame_read(&rx_frame);	
    				if (rx_frame.length < TRXBUFSIZE)
    					rx_frame.data[rx_frame.length] = 0;
    				else {
    					rx_frame.data[0] = 0;				
    				}
    				reg = readRegister(7);
    
    				if (rx_frame.length < TRXBUFSIZE) {
    					byte_to_ascii(rx_frame.data,payload,rx_frame.length);
    					//sprintf(output,"read(%2x,%2x):%s\r\n",rx_frame.length,reg,rx_frame.data);
    					sprintf(output,"read(%2x,%2x):%s\r\n",rx_frame.length*2,reg,payload);
    					uart_putstr(1,output);		
    				}	
    				
    			}
    		}
    	}
    
    }
    
    
    
    



    Według dokumentacji nastąpiła zmiana w obsłudze SPI (MOSI) "SPI Interface: MISO pin is updated on falling edge at pin SCLK" ale ja mogę zapisywać i odczytywać rejestry w rf230 więc ISP działa chyba prawidłowo. Dlatego proszę o pomoc w poprawieniu kodu żeby działał z rev.B.
  • REKLAMA
REKLAMA