📄 spi_init_simulate.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 + -