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

📄 spi_init_simulate.cpp

📁 MXL9328LCD驱动实现
💻 CPP
字号:
#include "precomp.h"
#include <windows.h>
#include <memory.h>
#include "MC9328MXL.h"
#include "GPIO.h"
#include "Platform.h"

static TGPIO_Reg 	*gpGPIO[4],*gpSPI;
static TSPI_Reg		*tSPI2,*tSPI2f;

DWORD DATA_SEND[19]={0x409D,0x0204,0x0100,0x3000,0x4003,0x000A,
			0x0021,0x0C00, 0x0000,0x0103,0x0301,0x1F0F,
			0x1F0F,0x0707,0x0307,0x0707,0x0000,0x0004,
			0x0000};
												
void get_gpioport()
{

   gpGPIO[0] = (TGPIO_Reg*)VirtualAlloc(0, 4*1024, MEM_RESERVE, PAGE_NOACCESS);
   if (gpGPIO[0] == NULL) {
      ERRORMSG(1, (TEXT("GPIO_InitRegister: VirtualAlloc failed!\r\n")));
      return;
   }
   else {
      if (!VirtualCopy((PVOID)gpGPIO[0], (PVOID)(GPIO_A_Reg_Virtual_Address), 4*1024, (PAGE_READWRITE | PAGE_NOCACHE))) {
         ERRORMSG(1, (TEXT("GPIO_InitRegister: VirtualCopy failed!\r\n")));
         return;
      }
   }
   
   gpGPIO[3] = (TGPIO_Reg*)((DWORD)gpGPIO[0] + ((DWORD)GPIO_D_Reg_Virtual_Address - (DWORD)GPIO_A_Reg_Virtual_Address));
   
   /*gpSPI = (TGPIO_Reg*)VirtualAlloc(0, sizeof(TGPIO_Reg), MEM_RESERVE, PAGE_NOACCESS);
   if (gpSPI == NULL) {
      ERRORMSG(DRIVER_ERROR_MSG, (TEXT("HLJ->SPI_LCD_Class : VirtualAlloc failed!\r\n")));
      return;
   }*/

   //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   tSPI2 = (TSPI_Reg*) VirtualAlloc(0, sizeof(TSPI_Reg), MEM_RESERVE, PAGE_NOACCESS);
   if (tSPI2 == NULL) {
      ERRORMSG(DRIVER_ERROR_MSG, (TEXT("HLJ->SPI_LCD_Class : VirtualAlloc failed!\r\n")));
      return;
   }
   else {
      if (!VirtualCopy((PVOID)tSPI2, (PVOID)(SPI2_Reg_Virtual_Address), sizeof(TSPI_Reg), (PAGE_READWRITE | PAGE_NOCACHE))) {
         ERRORMSG(DRIVER_ERROR_MSG, (TEXT("HLJ->SPI_LCD_Class: VirtualCopy failed!\r\n")));
         return;
      }
   }
   
   /*tSPI2f = (TSPI_Reg*) VirtualAlloc(0, sizeof(TSPI_Reg), MEM_RESERVE, PAGE_NOACCESS);
   if (tSPI2f == NULL) {
      ERRORMSG(DRIVER_ERROR_MSG, (TEXT("HLJ->SPI_LCD_Class : VirtualAlloc failed!\r\n")));
      return;
   }
   else {
      if (!VirtualCopy((PVOID)tSPI2f, (PVOID)tSPI2, sizeof(TSPI_Reg), (PAGE_READWRITE | PAGE_NOCACHE))) {
         ERRORMSG(1, (TEXT("GPIO_InitRegister: VirtualCopy failed!\r\n")));
         return;
      }
   }*/
   
   
}
void spi_port_init()
{
	gpGPIO[3]->GIUS &= ~(BIT31);
	gpGPIO[3]->GIUS |= (BIT7 | BIT8 | BIT10);
	gpGPIO[3]->DDIR |= (BIT7 | BIT8 | BIT10);
	gpGPIO[3]->OCR1 &= ~(BIT14 | BIT15 | BIT16 | BIT17 | BIT20 | BIT21);
	gpGPIO[3]->PUEN &= ~(BIT7 | BIT8 | BIT10);
}

void spi_init()
{
	//get_gpioport();
	//tSPI2f = tSPI2;
	//tSPI2->RESETREG = 0x1;
	//BIT14=CLK BY 16 DIVEDE,BIT10 MASTER,BIT9 ENSPI, send 16 BIT
	tSPI2->CONTROLREG |= (BIT11 | BIT10 | BIT9 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0);
	//ENABLE EMPTY INT
	tSPI2->INTREG |= (BIT8);
	//insert 8 clock when transmit
	tSPI2->PERIODREG |= BIT3;
}

void set_data_to_send(DWORD reg,DWORD data)
{
	DWORD XCH;
	
	XCH = ~BIT8;
	while(!(tSPI2->CONTROLREG & XCH));
	while(!(tSPI2->INTREG | 0x1));
	
	if(reg)
	{
		
		tSPI2->TXDATAREG = 0x74;
		tSPI2->TXDATAREG = 0x00;
		tSPI2->TXDATAREG = data;
	}
	else
	{
		tSPI2->TXDATAREG =0x76;
		tSPI2->TXDATAREG = 0x00;
		tSPI2->TXDATAREG = data;
	}
}

void spi_test(DWORD reg,DWORD data)
{
  int i=0;
  while(1)
  {
	  i++;
	  Sleep(30);
	  set_data_to_send(reg,data);
	  set_data_to_send(reg,data);
	  set_data_to_send(reg,data);
	  DEBUGMSG(1, (TEXT("__%d\n"),i));
  }
}

void spi_port_free()
{
	int i;
	gpGPIO[3]->GIUS &= ~(BIT7 | BIT8 | BIT10);
	gpGPIO[3]->GIUS |= (BIT31);
	
	 if (gpGPIO != NULL) {
      		VirtualFree(gpGPIO, 0, MEM_RELEASE);
      		for (i=0; i<ARRAYSIZE(gpGPIO); i++) {
         	gpGPIO[i] = NULL;
      }
   }
   
   if (tSPI2 != NULL) {
      VirtualFree(tSPI2, 0, MEM_RELEASE);
   }
   
	//gpGPIO[3] = gpSPI;
	//tSPI2 = tSPI2f;
	//VirtualFree(gpSPI, 0, MEM_RELEASE);
	//VirtualFree(tSPI2f, 0, MEM_RELEASE);
}

void spi_start_run()
{
  static int i = 0;
  int j = 0;
  
  get_gpioport();
  spi_port_init();
  spi_init();
	
 //while(1)
 //{
 // j++;
  DEBUGMSG(1, (TEXT("__%d\n"),j));
  gpGPIO[3]->DR &= ~(BIT8);
  /*tSPI2->CONTROLREG = 0x00000000;
  if(j==30)
  {
  j = 0;
  tSPI2->CONTROLREG |= (BIT15 | BIT14);
  }

  if(j==10)
  {
  tSPI2->CONTROLREG |= (BIT15);
  }
  */
  tSPI2->CONTROLREG &= ~(BIT7);
  Sleep(5);         //delay 5ms
  set_data_to_send(1,9);
  set_data_to_send(0,0x0);

  //3.delay More than 10ms ->Power Setting Function 1 ->(R09 ← 4000h R0A ← 2000h)
  Sleep(15);         //delay 15ms
  set_data_to_send(1,9);
  set_data_to_send(0,0x4000); 
  set_data_to_send(1,10);
  set_data_to_send(0,0x2000); 

  //4.Power Setting Function 2 -> R09 ← 4055h
  set_data_to_send(1,9);
  set_data_to_send(0,0x4055); 

  //5.delay more than 50ms   Instruction Setting
  Sleep(50);         //delay 50ms

  for(i=0;i<19;i++){
      if(i!=8){
                set_data_to_send(1,i+1);
                set_data_to_send(0,*(DATA_SEND+i)); 
               }
              }

  //6.Wait more than 2 Frames 75HZ * 2 
  Sleep(27);         //delay 27ms

  //7.Display On Sequence ->R09 ← 4A55h R05 ← 5003h
  set_data_to_send(1,9);
  set_data_to_send(0,0x4A55); 

  set_data_to_send(1,5);
  set_data_to_send(0,0x5003);
  
  tSPI2->CONTROLREG |= (BIT7);
  Sleep(50);
 //}
  //spi_test(1,9);
  spi_port_free();
}

⌨️ 快捷键说明

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