⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是用M16做的jtag与stk500(正确说应该是ISP)合二为一的
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include "command.h"
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&definitions
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&definitions
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&definitions
#define LED_DDR  DDRB
#define LED_PORT PORTB
#define LED_PIN  PINB
#define LED      2

#define reset_DDR  DDRB
#define reset_PORT PORTB
#define reset_PIN  PINB
#define reset      PORTB1

#define spi_ddr DDRB

#define os_ddr DDRD
#define os 	   PORTD5

#define sck_ddr  DDRB
#define sck_port PORTB
#define sck	     PORTB7
//Set values as required supress popup messages in AVR-Studio 
#define HARDWARE_VERSION      0x02
#define SOFTWARE_MAJOR        0x02							//softwer ver. 2.04
#define SOFTWARE_MINOR        0x07
/* value for vtarget: always return 5.0V */
#define VTARGET		0x32
/* value for vadjust: always return 5.0V */
#define VADJUST		0x32
#define MAX_BUF_SIZE 275

#define messagesize1 2 
#define messagesize0 3
//888888887777777444444444444444444444444
#define STK501		0xAA
#define STK502		0x55
#define STK503		0xFA
#define STK504		0xEE
#define STK505		0xE4
#define STK520		0xDD	
/* value for vtarget: always return 5.0V */
#define VTARGET		0x32
/* value for vadjust: always return 5.0V */
#define VADJUST		0x32
/* prescalled clock frequesncy equal to system clock */
#define PSCALE_FSYS 0x01
#define CMATCH_DEF	0x00
#define SCK_DURATION_DEF 0x02
//***********************************functions
//***********************************functions
//***********************************functions
static void avr_init(void);
void putch(char ch);
char getch(void);
void flash_led(uint8_t count);
void get_message(void);
void get_message_body(void);
void sendResponse(void);
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void cmdSignOn(void);
void cmdGetParameter(void);
void cmdSetParameter(void);
void cmdEnterProgmodeIsp(void);
void cmdLeaveProgmodeIsp(void);
void cmdReadSignatureIsp(void);
void cmdreadosccalisp(void);
void cmdreadlockisp(void);
void cmdprogramlockisp(void);
void cmdreadfuseisp(void);
void cmdprogramfuseisp(void);
void cmdspimulti(void);
void cmdchiperaseisp(void);
void cmdloadaddress(void);
void cmdprogramflashisp(void);
void cmdreadflashisp(void);
void cmdprogrameepromisp(void);
void cmdreadeepromisp(void);
void cmdosccal(void);
//***********************************program functions
void delay_ms(int time);
char spi(char data);
void EnterProgmodeIsp(void);
void ReadfusebitIsp(void);
void programfuseisp(void);
void SetParameter(void);
//***********************************variables
unsigned char rx_buf[MAX_BUF_SIZE];						// RX buffer
unsigned char tx_buf[MAX_BUF_SIZE];						// TX buffer
unsigned int rx_ptr = 0;  									// pointer to rx buffer
unsigned int tx_ptr = 0;  									// pointer to rx buffer
unsigned char rx_chm=0;									// calculated recived message checksum
unsigned char tx_chm=0;									// calculated transmit message checksum
unsigned long address_flash = 0; 							// actual address in flash memory
unsigned int address_eeprom = 0; 						// actual address in eeprom memory
char extended_address=0;									//for larger flashes
char sckdurationdef=SCK_DURATION_DEF;						//spi frequency division
char cmatchdef=CMATCH_DEF;									//stk500 output frequency
char pscalefsys=PSCALE_FSYS;
//***********************************
int main(void)
{
    avr_init();
    
	flash_led(5);
    while(1)
    {
        // Tasks here.
		LED_PORT &= ~_BV(LED);
		get_message();
		LED_PORT |= _BV(LED);
		switch(rx_buf[5])
		{
			case CMD_SIGN_ON:
				cmdSignOn();
			break;	
			
			case CMD_GET_PARAMETER:
        		cmdGetParameter();
        	break;
			
			case CMD_SET_PARAMETER:
				cmdSetParameter();
			break;
			
			case CMD_ENTER_PROGMODE_ISP:
				cmdEnterProgmodeIsp();
			break;
			
			case CMD_LEAVE_PROGMODE_ISP:
				cmdLeaveProgmodeIsp();
			break;
			case CMD_READ_SIGNATURE_ISP:
				cmdReadSignatureIsp();
			break;
			
			case CMD_READ_OSCCAL_ISP:
				cmdreadosccalisp();
			break;
			
			case CMD_READ_FUSE_ISP:
				cmdreadfuseisp();
			break;
			
			case CMD_PROGRAM_FUSE_ISP:
				cmdprogramfuseisp();
			break;
			
			case CMD_READ_LOCK_ISP:
				cmdreadlockisp();
			break;
			
			case CMD_PROGRAM_LOCK_ISP:
				cmdprogramlockisp();
			break;
			
			case CMD_SPI_MULTI:
				cmdspimulti();
			break;
			
			case CMD_CHIP_ERASE_ISP:
				cmdchiperaseisp();
			break;
			
			case CMD_PROGRAM_FLASH_ISP:
				cmdprogramflashisp();
			break;
			
			case CMD_LOAD_ADDRESS:
				cmdloadaddress();
			break;
			
			case CMD_READ_FLASH_ISP:
				cmdreadflashisp();
			break;
			
			case CMD_PROGRAM_EEPROM_ISP:
				cmdprogrameepromisp();
			break;
			
			case CMD_READ_EEPROM_ISP:
				cmdreadeepromisp();
			break;
			
			case CMD_OSCCAL:
				cmdosccal();
			break;
			
		}
		sendResponse();
    }
    
    return(0);
}



static void avr_init(void)
{
    // Initialize device here.
    
	LED_DDR|=_BV(LED);										//set led out put
	os_ddr|=_BV(os);										//set os out put
	// USART initialization
	// Communication Parameters: 8 Data, 1 Stop, No Parity
	// USART Receiver: On
	// USART Transmitter: On
	// USART Mode: Asynchronous
	// USART Baud rate: 115200
	UCSRA=0x00;
	UCSRB=0x18;
	UCSRC=0x86;
	UBRRH=0x00;
	UBRRL=0x03;
	// SPI initialization
	// SPI Type: Master
	// SPI Clock Rate: 57.600 kHz
	// SPI Clock Phase: Cycle Half
	// SPI Clock Polarity: Low
	// SPI Data Order: MSB First
	
	SPCR=0x50;
	SPCR|=(0x3&SCK_DURATION_DEF);	
	SPSR=0x00;

	// Timer/Counter 1 initialization
	// Clock source: System Clock
	// Clock value: 7372.800 kHz
	// Mode: CTC top=OCR1A
	// OC1A output: Toggle
	// OC1B output: Discon.
	// Noise Canceler: Off
	// Input Capture on Falling Edge
	TCCR1A=0x40;
	TCCR1B=0x08|PSCALE_FSYS;
	TCNT1H=0xFF;
	TCNT1L=0xFF;
	OCR1AH=0x00;
	OCR1AL=CMATCH_DEF;
	OCR1BH=0x00;
	OCR1BL=0x00;
    return;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void putch(char ch)
{
    while (!(UCSRA & _BV(UDRE)));
    UDR = ch;
}

char getch(void)
{
    while(!(UCSRA & _BV(RXC)));
    return UDR;
}


void flash_led(uint8_t count)
{
    uint32_t ll;
	uint8_t ii;
    if (count == 0) {
      count = 3;
    }
    
    for (ii = 0; ii < count; ++ii) {
	LED_PORT &= ~_BV(LED);
	for(ll = 0; ll < (F_CPU / 5); ++ll);
	LED_PORT |= _BV(LED);
	for(ll = 0; ll < (2 * F_CPU); ++ll);
    }	
}

void get_message(void)
{
		
		rx_ptr=0;
		rx_buf[rx_ptr]=getch();									//get MESSAGE_START
		rx_chm^=rx_buf[rx_ptr];
		rx_ptr++;
		
		//////////////////LED_PORT &= ~_BV(LED);										//turn led on
		
		rx_buf[rx_ptr]=getch();									//get SEQUENCE_NUMBER
		rx_chm^=rx_buf[rx_ptr];
		rx_ptr++;

		rx_buf[rx_ptr]=getch();									//get MESSAGE_SIZE[1]
		rx_chm^=rx_buf[rx_ptr];
		rx_ptr++;

		rx_buf[rx_ptr]=getch();									//get MESSAGE_SIZE[0]
		rx_chm^=rx_buf[rx_ptr];
		rx_ptr++;
		
		rx_buf[rx_ptr]=getch();									//get TOKEN
		rx_chm^=rx_buf[rx_ptr];
		rx_ptr++;

		get_message_body();												//get message body
		
		rx_buf[rx_ptr]=getch();									//get CHECKSUM
		rx_chm^=rx_buf[rx_ptr];
		
		if(rx_chm==0)													//message recived Ok!
		{
			rx_chm=0;
			rx_ptr=0;
			//go to start
		}
	////////////////////////////LED_PORT |= _BV(LED);									//turn led off
	
	
}
void get_message_body(void)
{
	int j,k;
	j=rx_buf[2]*256+rx_buf[3];								//calculate message size
	
	for(k=0;k<j;k++)
	{
		rx_buf[rx_ptr]=getch();
		rx_chm^=rx_buf[rx_ptr];
		rx_ptr++;
	}
	
}


void sendResponse(void)
{
	int j,k;
	tx_chm=0;
		
	tx_buf[0]=MESSAGE_START;								//MESSAGE_START
		
	tx_buf[1]=rx_buf[1];									//SEQUENCE_NUMBER
		
	tx_buf[4]=TOKEN;										//token
	
	for(j=0;j<5;j++)
	{	
		tx_chm^=tx_buf[j];
		putch(tx_buf[j]);
	}
	
	j=tx_buf[messagesize1]*256+tx_buf[messagesize0];
	for(k=0;k<j;k++)
	{
		tx_chm^=tx_buf[k+5];								//start from message body
		putch(tx_buf[k+5]);
	}
	
	putch(tx_chm);

}

void cmdSignOn(void)
{
	tx_buf[messagesize1]=0;  		// set message length
	tx_buf[messagesize0]=11;
	
	tx_buf[5]= CMD_SIGN_ON;
	tx_buf[6]= STATUS_CMD_OK;
	
	tx_buf[7]= 0x08;  	// send signature length
	tx_buf[8]= 'S';		// send identifier
	tx_buf[9] = 'T';
	tx_buf[10] = 'K';
	tx_buf[11] = '5';
	tx_buf[12] = '0';
	tx_buf[13] = '0';
	tx_buf[14] = '_';
	tx_buf[15] = '2';

}
void cmdGetParameter(void)
{
	tx_buf[messagesize1]=0;  		// set message length
	tx_buf[messagesize0]=3;
	
	tx_buf[5] = CMD_GET_PARAMETER;
	tx_buf[6] = STATUS_CMD_OK;

	switch( rx_buf[6] )  {
		case PARAM_HW_VER: 
            tx_buf[7] = HARDWARE_VERSION;  // send hardware version          				
			break;
		case PARAM_SW_MAJOR: 
            tx_buf[7] = SOFTWARE_MAJOR; // send software major version         				
			break;        			
		case PARAM_SW_MINOR: 
            tx_buf[7] = SOFTWARE_MINOR;  // send software minor version          				
			break;			
		case PARAM_VTARGET: 
            tx_buf[7] = VTARGET; // target supply voltage         				
			break;        			
		case PARAM_VADJUST: 
            tx_buf[7] = VADJUST; // target VREF voltage          				
			break;  
		case PARAM_OSC_PSCALE: 
            tx_buf[7] = pscalefsys; // oscilator prescaler value         				
			break;
		case PARAM_OSC_CMATCH: 
            tx_buf[7] = cmatchdef; // oscilator compare value         				
			break;			
		case PARAM_SCK_DURATION: 
            tx_buf[7] = sckdurationdef; // oscilator compare value         				
			break;        			       			        			        			

		case PARAM_TOPCARD_DETECT: 
            tx_buf[7] =  STK501; // STK501 is expected          				

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -