Jag köpte ett par STM32F103C8T6 moduler på ebay, mest för att bekanta mig med dem lite, inget speciellt projekt.
Testade serieporten, system timer, blinka LED osv.
Sen tänkte jag prova SPI(med en nrF24L01 modul) men det är här jag har problem.
Nu har jag inte använt SPL eller STMCube utan endast endast header-filen STM32f10x.h.
Detta för att jag vill lära mig controllern och de vanligaste basic-registren osv.
Nu får jag inga klockpulser eller data, endast SS är aktiv.
Jag använder SPI1.
Här är initiering:
Kod: Markera allt
void init_SPI(void){
//SPI
AFIO->MAPR&=~AFIO_MAPR_SPI1_REMAP;
RCC->APB2ENR|=RCC_APB2ENR_SPI1EN|RCC_APB2ENR_AFIOEN; //Pheriperal clock on for SPI1..
GPIOA->CRL|= GPIO_CRL_MODE5|GPIO_CRL_CNF5_1 //output alternate function push pull SCK
|GPIO_CRL_CNF6_0 //input floating MISO
|GPIO_CRL_MODE7|GPIO_CRL_CNF7_1 //output alternate function push pull MOSI
|GPIO_CRL_MODE2_0|GPIO_CRL_CNF2_0
|GPIO_CRL_MODE3_0|GPIO_CRL_CNF3_0; //general purpose output push pull CE_PIN
SPI1->CR1|=SPI_CR1_BR_0|SPI_CR1_BR_1|SPI_CR1_SSI|SPI_CR1_SSM; //SPI on, PCLK2/16=4MHz, Master
//no CRC,8 bits data frame, full duplex, MSB first, clock idle low, data on rising edge, SS not active
SPI1->CR1|=SPI_CR1_SPE|SPI_CR1_MSTR;
SET_SS_PIN;
CLEAR_CE_PIN; //this is CE for the nrF-module..
}
Kod: Markera allt
unsigned char rw_SPI(unsigned char data){
while(!(SPI1->SR&SPI_SR_TXE)); //wait for sendbuffer
SPI1->DR=data;
while(!(SPI1->SR&SPI_SR_RXNE)); //wait for receivebuffer to fill up..
while(SPI1->SR&SPI_SR_BSY);
return SPI1->DR;
}
Kod: Markera allt
// läser från radion, kommando eller register, kan användas för alla operationer, kommandon och register i headerfilen
// reg är kommando eller register, *result är pekare till platsen där datat skall läggas, number är storleken på datat
// returvärde är statusregistret i nRF
unsigned char read_nRF(unsigned char reg,unsigned char *result, unsigned char number){
unsigned char i;
CLEAR_SS_PIN;
i=reg;
reg=rw_SPI(reg); //skicka "läs register no reg", läs status på samma gång..
if(i!=NOP) //om kommandot var NOP läs endast status och hoppa över for slingan..
for(i=0;i<number;i++){
result[i]= rw_SPI(NOP); //dummy byte skrivs, samtidigt klockas valda registret in..
}
SET_SS_PIN;
return reg;
}
// skriver till radion, kommando eller register, kan användas för alla operationer, kommandon och register i headerfilen
// reg är kommando eller register, *data är pekare till data som skall skrivas, number är storleken på datat
// returvärde är statusregistret i nRF
unsigned char write_nRF(unsigned char reg, unsigned char *data, unsigned char number){
unsigned char i;
CLEAR_SS_PIN;
if(!(reg & 0b11100000))reg=reg+0b00100000; //om de tre övre bitarna är noll så är det skrivning till registren och då skall
//bit5 ettställas
reg=rw_SPI(reg);
for(i=0;i<number;i++){
rw_SPI(data[i]); //
}
SET_SS_PIN;
return reg; //returnera STATUS
}
Alternate function klockan är på samt Pheriperal clock för porta (SS_PIN på porta och den är aktiv)
Ser som sagt ingen aktivitet förutom SS_PIN (med logikanalysatorn).
Vad kan jag ha missat?
Tacksam för hjälp
Magnus