小模块例程: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;
}
附录
-
模块框图
-
引脚约束
#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]}]