STM32F103C8T6 SPI problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
MGL
Inlägg: 131
Blev medlem: 1 oktober 2008, 19:38:16
Ort: Åland

STM32F103C8T6 SPI problem

Inlägg av MGL »

Hej!
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..
}
Läs/skriv funktion:

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;
}
Läs och skriv för nrF-modulen:

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

}
Stänger jag av klockan(APB2) till SPI1 så stannar controllern i väntan på TXE flaggan(eller om det var RXNE), så den klockan är Ok antar jag.
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
MGL
Inlägg: 131
Blev medlem: 1 oktober 2008, 19:38:16
Ort: Åland

Re: STM32F103C8T6 SPI problem

Inlägg av MGL »

Har inte rört detta över sommaren men satte mig ner idag igen..
Det visade sig att om jag ändrade baudrate till APB2/256 i SPI_CR1 registret så vaknade SPI till liv.
APB2 är 64MHz.
Ändrade till /128, då försvann klockpulserna men data på MOSI blev kvar.
Höjde jag frekvensen ett steg till försvann även aktiviteten på MOSI.
Sen provade jag istället sänka APB2 men med samma resultat dvs max klockfrekvens på SPI som jag uppnår är 250kHz.
Inställningen på portutgångarna är MODE[1:0]=11 dvs max 50MHz.

Har ni några idéer?
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: STM32F103C8T6 SPI problem

Inlägg av lillahuset »

Hur har du ställt hastigheten på pinnarna. Ställ upp den på max och se om det fungerar.

Edit: Fan va slarvigt jag läste. Det var inget. :(
MGL
Inlägg: 131
Blev medlem: 1 oktober 2008, 19:38:16
Ort: Åland

Re: STM32F103C8T6 SPI problem

Inlägg av MGL »

Hoppsan! :oops: Jag satt med en sån där saleae-kinaklon logikanalysator, jag äger ju bara ett gammalt analogt oscilloskop så det är ju inte så behändigt för digitala signaler, men visst har jag aktivitet även med högre SPI hastigheter det upptäckte jag när jag drog fram det gamla Hameg HM412-5. :D .
Jag tänkte inte så mycket på att det skulle finnas någon begränsing där annat än samplingshastigheten (24MHz) men när jag bände locket av den såg jag att det sitter en 74HC245 som buffer på ingången som har en stig och falltid på minst Edit:max 500ns.
Jaja jag känner mej ju lite dum nu :doh:
Börjar nog bli dags att skaffa ett nytt oscilloscop nu!

Tack i alla fall !
Edit:
74HC245:an matas med 3,3V skall byta en till en 74LCX245 som är snabbare och har 5V toleranta ingångar!
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: STM32F103C8T6 SPI problem

Inlägg av lillahuset »

Härligt, då är jag inte ensam. :)
Skriv svar