Witam,
Użeram się z tym już od jakiegoś czasu. Na początku myślałem, że problem leży w bibliotekach od ST, ale pozbyłem się ich i dalej ten sam problem.
Komunikuję stm32 z atmega8 i 16. Na początku chcę po prostu przesłać jakąś daną do atmegi, a ta dana ma do mnie wrócić - wynik wyświetlam w hyperterminalu (mam skonfigurowanego usarta3). Udało mi się ustalić, że linia MISO działa poprawnie - po włączeniu zasilania na atmega do bufora nadawczego SPI zapisuje znany mi znak. Ten znak następnie odbieram w terminalu. Coś musi być z linią MOSI.
Korzystam z SPI2. Niestety nie mogę sprawdzić komunikacji łącząc SPI2-SPI1 lub SPI2-SPI3 (SPI1 podłączone na stałe do jakiejś kości, SPI3 - tutaj mam jtag-a).
Sprawdzałem już stany rejestrów RCC, GPIOB, CR1 i CR2 - wszystko się zgadza.
Co dalej robić? Co sprawdzać? Co zmieniać?
Funkcja wysyłająca dane służy też do odbioru danych.
Czy możliwe jest, że uszkodziłem linię MOSI poprzez podłączenie jej do linii 5V MOSI atmegi? Być może poprzedni właściciel płytki z której korzystam uszkodził ten pin? Bo to chyba nie jest normalne, że wysyłam same jedynki...
Użeram się z tym już od jakiegoś czasu. Na początku myślałem, że problem leży w bibliotekach od ST, ale pozbyłem się ich i dalej ten sam problem.
Komunikuję stm32 z atmega8 i 16. Na początku chcę po prostu przesłać jakąś daną do atmegi, a ta dana ma do mnie wrócić - wynik wyświetlam w hyperterminalu (mam skonfigurowanego usarta3). Udało mi się ustalić, że linia MISO działa poprawnie - po włączeniu zasilania na atmega do bufora nadawczego SPI zapisuje znany mi znak. Ten znak następnie odbieram w terminalu. Coś musi być z linią MOSI.
Korzystam z SPI2. Niestety nie mogę sprawdzić komunikacji łącząc SPI2-SPI1 lub SPI2-SPI3 (SPI1 podłączone na stałe do jakiejś kości, SPI3 - tutaj mam jtag-a).
Sprawdzałem już stany rejestrów RCC, GPIOB, CR1 i CR2 - wszystko się zgadza.
Co dalej robić? Co sprawdzać? Co zmieniać?
void SPI_Init()
{
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; //włącz taktowanie dla GPIOB
//SCK AFPP, PB13
GPIOB->CRH |= (GPIO_CRH_MODE & GPIO_CRH_MODE13); //mode dla pin PB13: AF output push-pull 50MHz
GPIOB->CRH &= ~GPIO_CRH_CNF13; //wyzerowanie domyślnej konfiguracji pinu PB13 jako input floating
GPIOB->CRH |= (GPIO_CRH_CNF & GPIO_CRH_CNF13_1); //ustawienie nowej konfiguracji dla pinu PB13 jako AFPP
//MOSI AFPP, PB15
GPIOB->CRH |= (GPIO_CRH_MODE & GPIO_CRH_MODE15); //mode dla pin PB15: AF output push-pull 50MHz
GPIOB->CRH &= ~GPIO_CRH_CNF15; //wyzerowanie domyślnej konfiguracji pinu PB15 jako input floating
GPIOB->CRH |= (GPIO_CRH_CNF & GPIO_CRH_CNF15_1); //ustawienie nowej konfiguracji dla pinu PB15 jako AFPP
//MISO IF or IPU, PB14
GPIOB->CRH &= ~GPIO_CRH_CNF14; //wyzerowanie domyślnej konfiguracji pinu PB14 jako input floating
GPIOB->CRH |= (GPIO_CRH_CNF & GPIO_CRH_CNF14_1); //ustawienie nowej konfiguracji dla pinu PB14 jako input pull up
GPIOB->ODR |= (1<<14); //pull up pinu PB14 (podciąganie wejścia)
//NSS, PB12
GPIOB->CRH |= (GPIO_CRH_MODE & GPIO_CRH_MODE12); //mode dla pin PB12: output push-pull 50MHz
GPIOB->CRH &= ~GPIO_CRH_CNF12; //wyzerowanie domyślnej konfiguracji pinu PB12 jako input floating; otrzymujemy konfigurację dla gpio push pull
GPIOB->ODR |= ((uint32_t)1<<12); //ustawiony
//konfiguracja SPI
RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; //włącz taktowanie dla SPI2
SPI2->CR1=0;
SPI2->CR2=0;
SPI2->CR1 |= SPI_CR1_BR; //SPI2_CLK/256,
SPI2->CR1 |= SPI_CR1_CPHA; //CPOL=0, CPHA=1
SPI2->CR1 &= ~SPI_CR1_DFF; //8-bit danych
//SPI2->CR2 |= SPI_CR2_SSOE; //SS output enable
SPI2->CR1 |= SPI_CR1_SSI | SPI_CR1_SSM;
SPI2->CR1 |= SPI_CR1_MSTR | SPI_CR1_SPE; //master mode, spi enable
}
uint8_t SPI_SendData(uint8_t data)
{
GPIOB->ODR &= ~((uint32_t)1<<12);
SPI2->DR = data;
while( !(SPI2->SR & SPI_SR_TXE) );
while( !(SPI2->SR & SPI_SR_RXNE) );
GPIOB->ODR |= ((uint32_t)1<<12);
return SPI2->DR;
}Funkcja wysyłająca dane służy też do odbioru danych.
Czy możliwe jest, że uszkodziłem linię MOSI poprzez podłączenie jej do linii 5V MOSI atmegi? Być może poprzedni właściciel płytki z której korzystam uszkodził ten pin? Bo to chyba nie jest normalne, że wysyłam same jedynki...