2021-03-01 01:10 AM
I successfully used a HAL code I found on Github for driving an ili9341 TFT LCD with SPI then I rewrote the code with registers. Part of my code works and I am able to fill pixels with color but when I try to use a function named ILI9341_Draw_Colour_Burst the code doesn't work. I tried to use the Keil debugger to see what happens and it showed a hard fault occurred. The function code is shown below
void ILI9341_Draw_Colour_Burst(uint16_t Colour, uint32_t Size)
{
//SENDS COLOUR
uint32_t Buffer_Size = 0;
if((Size*2) < BURST_MAX_SIZE)
{
Buffer_Size = Size;
}
else
{
Buffer_Size = BURST_MAX_SIZE;
}
LCD_DC_PORT->BSRR |= LCD_DC_PIN;
LCD_CS_PORT->BRR |= LCD_CS_PIN;
unsigned char chifted = Colour>>8;;
unsigned char burst_buffer[Buffer_Size];
for(uint32_t j = 0; j < Buffer_Size; j+=2)
{
burst_buffer[j] = chifted;
burst_buffer[j+1] = Colour;
}
uint32_t Sending_Size = Size*2;
uint32_t Sending_in_Block = Sending_Size/Buffer_Size;
uint32_t Remainder_from_block = Sending_Size%Buffer_Size;
if(Sending_in_Block != 0)
{
for(uint32_t j = 0; j < (Sending_in_Block); j++)
{
write_buffer32((unsigned char *)burst_buffer,Buffer_Size) ;
}
}
//REMAINDER!
write_buffer32((unsigned char *)burst_buffer,Remainder_from_block) ;
LCD_CS_PORT->BSRR |= LCD_CS_PIN;
}
and the code I wrote for SPI is as follows:
#define RXNE 0x01
#define TXE 0x02
#define BSY 0x80
void SPIInit(void)
{
RCC->APB2ENR |= (1<<12); /* Enable SPI1 clock */
GPIOA->CRL&=~0xFFF00000;
GPIOA->CRL |=0xB4B00000;
/* Enable SPI in Master Mode, CPOL=0, CPHA=0. */
/* Clock speed = fPCLK1 / 256 = 280 kHz at 72 MHz PCLK1 clk. */
SPI1->CR1 = (0 << 0) | // Clock phase
(0 << 1) | // Clock polarity
(1 << 2) | // Master selection
(1 << 3) | // Baud rate control clock/2
(1 << 6) | // SPI enable
(0 << 7) | // Frame format : 0: MSB transmitted first
(1 << 8) | // Internal slave select
(1 << 9) | // Software slave management enabled
(0 << 11); // Data frame format : 0: 8-bit
SPI1->CR2 = 0x0000;
}
u8 SPI1_WriteByte(uint8_t TxData)
{
/* Loop while DR register in not emplty , 1: Tx buffer empty*/
while ((SPI1->SR & TXE) == 0);
/* Send byte through the SPI2 peripheral */
SPI1->DR = TxData;
/* Wait to receive a byte ,1: Rx buffer not empty*/
while ((SPI1->SR & RXNE) == 0);
/* Return the byte read from the SPI bus */
return SPI1->DR;
}
void write_buffer(unsigned char *data,u8 size)
{
u8 i;
for(i=0;i<size;i++)
SPI1_WriteByte(data[i]);
}
void write_buffer32(unsigned char *data,int size)
{
int i;
for(i=0;i<size;i++)
SPI1_WriteByte(data[i]);
}
what might be the problem?
Solved! Go to Solution.
2021-03-01 06:41 AM
my problem is solved! I changed the BURST_MAX_SIZE value from 500 to 100 and the function worked! I'm still curious that what was the reason behind the hard fault
i attached an image of the hard fault error of the debugger.
2021-03-01 01:39 AM
I suppose you are aware of performance limits with a serial connection (SPI) and busy-waits.
I can't see an immediate problem, so I would tackle the problem from the other end.
What do the SCB fault registers say when the hardfault occurs ?
Can you switch to instruction step mode, and step to the critical sections ?
Register values will usually quickly reveal the problem.
2021-03-01 06:41 AM
my problem is solved! I changed the BURST_MAX_SIZE value from 500 to 100 and the function worked! I'm still curious that what was the reason behind the hard fault
i attached an image of the hard fault error of the debugger.