本帖最后由 scyangjunjie 于 2023-3-13 17:34 编辑
芯片用的是AT32F435VGSPI2只挂了一个TFT屏
引脚定义如下
PB13 SCK
PC2 MISO
PC3 MOSI
PB12 CS
问题现象:示波器能观察到输出时序,但是TFT无法显示,尝试调整分频系数,还是无法显示
尝试修改:将硬件SPI换成GPIO软件模拟SPI,就能正常显示(没有用到MISO引脚读入,纯写入操作)各位帮忙看看。
代码如下
#include "stdio.h"
#include "bsp_spi.h"
spi_init_type spi_init_struct;
static void spi_gpio_config(void);
/**
* @brief spi configuration.
* @param none
* @retval none
*/
void spi_config(void)
{
spi_gpio_config();
crm_periph_clock_enable(CRM_SPI2_PERIPH_CLOCK, TRUE);
spi_default_para_init(&spi_init_struct);
spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_64;
spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_LOW;
spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
spi_init(SPI2, &spi_init_struct);
spi_enable(SPI2, TRUE);
}
/**
* @brief gpio configuration.
* @param none
* @retval none
*/
static void spi_gpio_config(void)
{
gpio_init_type gpio_initstructure,gpio_initstructure1;
crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_initstructure);
/* spi2 sck pin */
gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_initstructure.gpio_pull = GPIO_PULL_DOWN;
gpio_initstructure.gpio_mode = GPIO_MODE_MUX;
gpio_initstructure.gpio_pins = GPIO_PINS_13;
gpio_init(GPIOB, &gpio_initstructure);
gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE13, GPIO_MUX_5);
/* spi2 miso pin */
gpio_initstructure.gpio_pull = GPIO_PULL_UP;
gpio_initstructure.gpio_pins = GPIO_PINS_2;
gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_initstructure.gpio_mode = GPIO_MODE_MUX;
gpio_init(GPIOC, &gpio_initstructure);
gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE2, GPIO_MUX_5);
/* spi2 mosi pin */
gpio_initstructure1.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_initstructure1.gpio_pull = GPIO_PULL_UP;
gpio_initstructure1.gpio_pins = GPIO_PINS_3;
gpio_initstructure1.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_initstructure1.gpio_mode = GPIO_MODE_MUX;
gpio_init(GPIOC, &gpio_initstructure1);
gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE3, GPIO_MUX_5);
/////////////////////////////////////////////////////////////////////////
/* spi2 cs pin */
gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
gpio_initstructure.gpio_pins = GPIO_PINS_12;
gpio_initstructure.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOB, &gpio_initstructure);
}
void spi2SendByte(uint8_t byte)
{
while(spi_i2s_flag_get(SPI2, SPI_I2S_TDBE_FLAG) == RESET);
spi_i2s_data_transmit(SPI2,byte);
}
这部分是模拟的时序
就用了SCK MOSI
void SPI2SendByte(uint8_t byte)
{
unsigned char i,Result = 0;;
for(i=0;i<8;i++)
{
if(byte & 0x80) SPI_MOSI(1);
else SPI_MOSI(0);
byte <<= 1;
SPI_CLK(0);
SPI_CLK(1);
Result <<= 1;
//if(SPI_MISO()) Result |= 0x01;
}
SPI_CLK(0);
//return(Result);
}
|