小模块例程:spi_st7789 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

zynq

  • mb_zynq_periph_test
  • 基于小梅哥的库,使用了AXI_SPI.h, AXI_GPIO.h
#include "COMMON.h"

typedef struct{
	u8 txbuf[32];
	u8 rxbuf[32];
	u8 length;
}t_buf;

t_buf WriteBuffer[]={
	{{0x11},{0x00},1},
	{{0x21},{0x00},1},

	{{0x3A,0x55},{0x00},2},
	{{0xff},{0x00},0}, //length=0 => delay_ms

	{{0x29},{0x00},1},
};


void print_buffer(u8 *pdata, int length)
{
	for(int i=0; i<length; i++){
		xil_printf("pdata[%d]=%x\r\n", i, pdata[i]);
	}
	xil_printf("********************\r\n");
}

void do_reset()
{
	AXI_GPIO_SetPin(&AXI_GPIO0, XGPIO_IR_CH2_MASK, 0, 0);
	usleep(1000);
	AXI_GPIO_SetPin(&AXI_GPIO0, XGPIO_IR_CH2_MASK, 0, 1);
	usleep(1000);
}

void send_command(u8 cmd)
{
	AXI_GPIO_SetPin(&AXI_GPIO0, XGPIO_IR_CH2_MASK, 1, 0);
	AXI_SPI_Transfer(&AXI_SPI0, 0, NULL, &cmd, 1);
	AXI_GPIO_SetPin(&AXI_GPIO0, XGPIO_IR_CH2_MASK, 1, 1);
}

void send_data(u8 *p, u16 length)
{
	AXI_SPI_Transfer(&AXI_SPI0, 0, NULL, p, length);
}

void seqs_init() {
	for (int i = 0; i < sizeof(WriteBuffer) / sizeof(*WriteBuffer); i++) {
		if (WriteBuffer[i].length == 0) {
			usleep(WriteBuffer[i].txbuf[0] * 1000);
			continue;
		}

		AXI_GPIO_SetPin(&AXI_GPIO0, XGPIO_IR_CH2_MASK, 1, 0);
		AXI_SPI_Transfer(&AXI_SPI0, 0, NULL, &WriteBuffer[i].txbuf[0], 1);  //send_command
		AXI_GPIO_SetPin(&AXI_GPIO0, XGPIO_IR_CH2_MASK, 1, 1);
		if (WriteBuffer[i].length > 1) {
			AXI_SPI_Transfer(&AXI_SPI0, 0, WriteBuffer[i].rxbuf,
					&WriteBuffer[i].txbuf[1], WriteBuffer[i].length - 1);   //send_data
		}
	}
}

void draw_single_color_rect(u16 x0, u16 y0, u16 width, u16 height, u16 color){
    // Assuming color is in RGB565 format
    send_command(0x2A);  // Set column address (x start and end)
    u8 xdata[]={(x0 >> 8) & 0xFF, x0 & 0xFF, ((x0 + width - 1) >> 8) & 0xFF, (x0 + width - 1) & 0xFF};
    send_data(xdata, 4);

    send_command(0x2B);  // Set row address (y start and end)
    u8 ydata[]={(y0 >> 8) & 0xFF, y0 & 0xFF, ((y0 + height - 1) >> 8) & 0xFF, (y0 + height - 1) & 0xFF};
    send_data(ydata, 4);

    send_command(0x2C);  // Write memory

    // Calculate the 16-bit RGB565 color
    u8 color_high = (color >> 8) & 0xFF;
    u8 color_low = color & 0xFF;
    u8 pdata[]={color_high,color_low};

    // Create the data array for the specified color and dimensions
	for(int i=0; i<width*height; i++){
		send_data(pdata,2);
	}
}

void draw_eight_colors(){
		u16 colors[] = {
		    0xF800,  // Red
		    0x07E0,  // Green
		    0x001F,  // Blue
		    0x07FF,  // Cyan
		    0xFFE0,  // Yellow
		    0xF81F,  // Magenta
		    0x0000,  // Black
		    0xFFFF   // White
		};


    for(int i=0; i<sizeof(colors)/sizeof(*colors);i++){
        draw_single_color_rect(0, 0, 240, 240, colors[i]);
        usleep(100*1000);
    }
}

int main(void)
{

	//初始化通用中断控制器
	ScuGic_Init();

	//初始化AXI_SPI0,设为主机模式
	AXI_SPI_Init(&AXI_SPI0, XPAR_SPI_0_DEVICE_ID, XSP_MASTER_OPTION|XSP_CLK_ACTIVE_LOW_OPTION);

	//初始化GPIO,用作为reset/dcx
	AXI_GPIO_Init(&AXI_GPIO0,GPIO_0_ID);	//初始化AXI GPIO0
	AXI_GPIO_Set_Channel(&AXI_GPIO0, XGPIO_IR_CH2_MASK, 0x00, 0b11);//设置通道2为输出

	//初始化私有定时器中断,定时间隔100ms
	ScuTimer_Int_Init(100000);

	do_reset();
//	send_command(0x11);
//	send_command(0x21);
//	send_command(0x3A); u8 data=0x55; send_data(&data,1);
//
//	usleep(120*1000);
//	send_command(0x29);

	seqs_init();
	draw_eight_colors();


	while(1) {
		//刷新间隔由私有定时器中断控制,中断服务函数在ISR.c中
		if(Refresh_Flag) {
			Refresh_Flag = 0;

			//xil_printf("timer run!\r\n");
		}
	}

	return 0;
}

附录

  • 模块框图 image

  • 引脚约束

#create_clock -period 20.000 -name sys_clk [get_ports sys_clk]
#set_property -dict {PACKAGE_PIN N18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
#set_property -dict {PACKAGE_PIN P14 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]

set_property -dict {PACKAGE_PIN H15 IOSTANDARD LVCMOS33} [get_ports uart_rxd]
set_property -dict {PACKAGE_PIN G15 IOSTANDARD LVCMOS33} [get_ports uart_txd]

set_property -dict {PACKAGE_PIN M19 IOSTANDARD LVCMOS33} [get_ports {key_tri_io[0]}]
set_property -dict {PACKAGE_PIN M20 IOSTANDARD LVCMOS33} [get_ports {key_tri_io[1]}]

set_property -dict {PACKAGE_PIN B20 IOSTANDARD LVCMOS33} [get_ports {led_tri_io[0]}]
set_property -dict {PACKAGE_PIN D20 IOSTANDARD LVCMOS33} [get_ports {led_tri_io[1]}]
set_property -dict {PACKAGE_PIN H18 IOSTANDARD LVCMOS33} [get_ports pwm]
#set_property -dict {PACKAGE_PIN F20 IOSTANDARD LVCMOS33} [get_ports {iic_gpio[0]}]

set_property -dict {PACKAGE_PIN E19 IOSTANDARD LVCMOS33} [get_ports i2c1_scl_io]
set_property -dict {PACKAGE_PIN G18 IOSTANDARD LVCMOS33} [get_ports i2c1_sda_io]

set_property -dict {PACKAGE_PIN P15 IOSTANDARD LVCMOS33} [get_ports i2c2_scl_io]
set_property -dict {PACKAGE_PIN P16 IOSTANDARD LVCMOS33} [get_ports i2c2_sda_io]

set_property -dict {PACKAGE_PIN C20 IOSTANDARD LVCMOS33} [get_ports {qspi_ss_io[0]}]
set_property -dict {PACKAGE_PIN D19 IOSTANDARD LVCMOS33} [get_ports qspi_sck_io]
set_property -dict {PACKAGE_PIN J18 IOSTANDARD LVCMOS33} [get_ports qspi_io0_io]
set_property -dict {PACKAGE_PIN F19 IOSTANDARD LVCMOS33} [get_ports qspi_io1_io]
set_property -dict {PACKAGE_PIN G19 IOSTANDARD LVCMOS33} [get_ports qspi_io2_io]
set_property -dict {PACKAGE_PIN J20 IOSTANDARD LVCMOS33} [get_ports qspi_io3_io]

set_property SLEW FAST [get_ports qspi_io0_io]
set_property SLEW FAST [get_ports qspi_io1_io]
set_property SLEW FAST [get_ports qspi_io2_io]
set_property SLEW FAST [get_ports qspi_io3_io]
set_property SLEW FAST [get_ports qspi_sck_io]

set_property PULLUP true [get_ports i2c2_scl_io]
set_property PULLUP true [get_ports i2c2_sda_io]


# for my w25qxx
#set_property -dict {PACKAGE_PIN B19 IOSTANDARD LVCMOS33} [get_ports {spi_ss_io[0]}]
#set_property -dict {PACKAGE_PIN E18 IOSTANDARD LVCMOS33} [get_ports spi_sck_io]
#set_property -dict {PACKAGE_PIN E17 IOSTANDARD LVCMOS33} [get_ports spi_io0_io]
#set_property -dict {PACKAGE_PIN H16 IOSTANDARD LVCMOS33} [get_ports spi_io1_io]

#set_property SLEW FAST [get_ports spi_io0_io]
#set_property SLEW FAST [get_ports spi_io1_io]
#set_property SLEW FAST [get_ports spi_sck_io]

# for st7789
set_property -dict {PACKAGE_PIN V17 IOSTANDARD LVCMOS33} [get_ports {spi_ss_io[0]}]
set_property -dict {PACKAGE_PIN W18 IOSTANDARD LVCMOS33} [get_ports spi_sck_io]
set_property -dict {PACKAGE_PIN T16 IOSTANDARD LVCMOS33} [get_ports spi_io0_io]
set_property -dict {PACKAGE_PIN V16 IOSTANDARD LVCMOS33} [get_ports spi_io1_io]

set_property SLEW FAST [get_ports spi_io0_io]
set_property SLEW FAST [get_ports spi_io1_io]
set_property SLEW FAST [get_ports spi_sck_io]

set_property -dict {PACKAGE_PIN T17 IOSTANDARD LVCMOS33} [get_ports {spi_rst_dc_tri_io[0]}]
set_property -dict {PACKAGE_PIN R16 IOSTANDARD LVCMOS33} [get_ports {spi_rst_dc_tri_io[1]}]

image