STM32F429 Discovery SPI Registers
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2014-08-21 7:14 AM
I am trying to use theSTM32F429 Discovery boardin order to communicate in a transmit only mode to an LCD over SPI. However, every time I write to the data register to output, I see nothing get loaded in my debugging view (CrossStudio). I'm using Pin 4 for my CSS.
#include
''stm32f4xx.h''
//#include
''tm_stm32f4_spi.h''
#def
ine MODE_CLEAR (
1
<<
5
)
/* M0:M2 = 0b001 = 1 */
#def
ine MODE_UPDATE (
4
<<
5
)
/* M0:M2 = 0b100 = 4 */
#def
ine MODE_DISPLAY (
0
<<
5
)
/* M0:M2 = 0b000 = 0 */
unsigned char transmitData[
20
];
int main(void) {
int dummy;
int j;
SET_BIT(RCC->AHB
1
ENR,(RCC_AHB
1
ENR_GPIOCEN | RCC_AHB
1
ENR_GPIOAEN) );
MODIFY_REG(GPIOC->MODER,
(GPIO_MODER_MODER
10
| GPIO_MODER_MODER
12
) ,
(GPIO_MODER_MODER
10
_
1
| GPIO_MODER_MODER
12
_
1
) ); // Sets to alternate function
SET_BIT(GPIOC->OTYPER, (GPIO_OTYPER_OT_
10
| GPIO_OTYPER_OT_
12
)); // Set output to push-pull type
CLEAR_BIT(GPIOC->PUPDR, (GPIO_PUPDR_PUPDR
10
| GPIO_PUPDR_PUPDR
12
) ); // Disable push pull resistors
SET_BIT(GPIOC->OSPEEDR, (GPIO_OSPEEDER_OSPEEDR
10
| GPIO_OSPEEDER_OSPEEDR
12
) ); // Set speed
high
/* Set the Alternate Function for the SPI3 pins */
// Port C Pins
7
-0
GPIOC->AFR[
0
] =
0
x
00000000
; // PTC
lower
order pins are
default
// Port C Pins
15
-8
GPIOC->AFR[
1
] =
0
x
00066600
; // PTC pins
10
,
11
, and
12
are for SPI (AF
6
=
0
x
6
)
// Set up SS for
screen
MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER
4
, GPIO_MODER_MODER
4
_
0
);
SET_BIT(GPIOA->BSRRL,
0
b
10000
); //Sets pin
4
high
// Enable the peripheral clock for SPI
3
SET_BIT(RCC->APB
1
ENR, RCC_APB
1
ENR_SPI
3
EN);
CLEAR_BIT(SPI
3
->CR
1
, SPI_CR
1
_CPHA);
SET_BIT(SPI
3
->CR
1
, SPI_CR
1
_CPOL);
//SET_BIT(SPI
3
->CR
1
, SPI_CR
1
_BIDIMODE);
//SET_BIT(SPI
3
->CR
1
, SPI_CR
1
_BIDIOE);
SET_BIT(SPI
3
->CR
1
, SPI_CR
1
_SSM);// Needed to enable single master
SET_BIT(SPI
3
->CR
1
, SPI_CR
1
_SSI);// Needed to enable single master
SET_BIT(SPI
3
->CR
1
, SPI_CR
1
_MSTR); // Set Master configuration
/* TODO: Set Baud to 2 MHz (not just a random prescaler) */
MODIFY_REG(SPI
3
->CR
1
, SPI_CR
1
_BR, SPI_CR
1
_BR); //Set to fCLK/
256
CLEAR_BIT(SPI
3
->CR
1
, SPI_CR
1
_LSBFIRST); // write out MSB first
SET_BIT(SPI
3
->CR
1
, SPI_CR
1
_SPE); // Enable SPI
3
transmitData[
0
]= MODE_CLEAR;
transmitData[
1
]=
0
x
00
;
for(j =
0
; j <
2
; j++) {
//TM_SPI_Send(SPI
3
, transmitData[j]);
SPI
3
->DR = transmitData[j]; // Write data to the data register
while( !(READ_BIT(SPI
3
->SR, SPI_SR_TXE)) ); // Wait until transmit is complete
while( READ_BIT(SPI
3
->SR, SPI_SR_BSY) );
dummy = SPI
3
->DR;
}
SET_BIT(GPIOA->BSRRH,
0
b
10000
); //Sets pin
4
low
while(
1
){
transmitData[
0
]= MODE_UPDATE;
transmitData[
1
]=
0
x
00
;
SET_BIT(GPIOA->BSRRL,
0
b
10000
); //Sets pin
4
high
for(j =
0
; j <
2
; j++) {
//TM_SPI_Send(SPI
3
, transmitData[j]);
SPI
3
->DR = transmitData[j]; // Write data to the data register
while( !(READ_BIT(SPI
3
->SR, SPI_SR_TXE)) ); // Wait until transmit is complete
while( READ_BIT(SPI
3
->SR, SPI_SR_BSY) );
}
SET_BIT(GPIOA->BSRRH,
0
b
10000
); //Sets pin
4
low
transmitData[
0
]=
0
x
80
; //UPDATE LINE
transmitData[
1
]=
0
xD
2
;
transmitData[
2
]=
0
xF
0
;
transmitData[
3
]=
0
xF
0
;
transmitData[
4
]=
0
xF
0
;
transmitData[
5
]=
0
xF
0
;
transmitData[
6
]=
0
xF
0
;
transmitData[
7
]=
0
xF
0
;
transmitData[
8
]=
0
xF
0
;
transmitData[
9
]=
0
xF
0
;
transmitData[
10
]=
0
xF
0
;
transmitData[
11
]=
0
xF
0
;
transmitData[
12
]=
0
xF
0
;
transmitData[
13
]=
0
xF
0
;
transmitData[
14
]=
0
xF
0
;
transmitData[
15
]=
0
xF
0
;
transmitData[
16
]=
0
xF
0
;
transmitData[
17
]=
0
xF
0
;
transmitData[
18
]=
0
x
00
;
transmitData[
19
]=
0
x
00
;
//Send update message over SPI
1
forever
SET_BIT(GPIOA->BSRRL,
0
b
10000
); //Sets pin
4
high
for(j =
0
; j <
20
; j++) {
//TM_SPI_Send(SPI
3
, transmitData[j]);
SPI
3
->DR = transmitData[j]; // Write data to the data register
while( !(READ_BIT(SPI
3
->SR, SPI_SR_TXE)) ); // Wait until transmit is complete
while( READ_BIT(SPI
3
->SR, SPI_SR_BSY) );
}
//osDelay(
10
);
SET_BIT(GPIOA->BSRRH,
0
b
10000
); //Sets pin
4
low
transmitData[
0
]=
0
x
80
; //UPDATE LINE
transmitData[
1
]=
0
x
52
;
transmitData[
2
]=
0
x
0
F;
transmitData[
3
]=
0
x
0
F;
transmitData[
4
]=
0
x
0
F;
transmitData[
5
]=
0
x
0
F;
transmitData[
6
]=
0
x
0
F;
transmitData[
7
]=
0
x
0
F;
transmitData[
8
]=
0
x
0
F;
transmitData[
9
]=
0
x
0
F;
transmitData[
10
]=
0
x
0
F;
transmitData[
11
]=
0
x
0
F;
transmitData[
12
]=
0
x
0
F;
transmitData[
13
]=
0
x
0
F;
transmitData[
14
]=
0
x
0
F;
transmitData[
15
]=
0
x
0
F;
transmitData[
16
]=
0
x
0
F;
transmitData[
17
]=
0
x
0
F;
transmitData[
18
]=
0
x
00
;
transmitData[
19
]=
0
x
00
;
//Send update message over SPI
1
forever
SET_BIT(GPIOA->BSRRL,
0
b
10000
); //Sets pin
4
high
for(j =
0
; j <
20
; j++) {
//TM_SPI_Send(SPI
3
, transmitData[j]);
SPI
3
->DR = transmitData[j]; // Write data to the data register
while( !(READ_BIT(SPI
3
->SR, SPI_SR_TXE)) ); // Wait until transmit is complete
while( READ_BIT(SPI
3
->SR, SPI_SR_BSY) );
}
SET_BIT(GPIOA->BSRRH,
0
b
10000
); //Sets pin
4
low
transmitData[
0
]= MODE_DISPLAY;
transmitData[
1
]=
0
x
00
;
SET_BIT(GPIOA->BSRRL,
0
b
10000
); //Sets pin
4
high
for(j =
0
; j <
2
; j++) {
//TM_SPI_Send(SPI
3
, transmitData[j]);
SPI
3
->DR = transmitData[j]; // Write data to the data register
while( !(READ_BIT(SPI
3
->SR, SPI_SR_TXE)) ); // Wait until transmit is complete
while( READ_BIT(SPI
3
->SR, SPI_SR_BSY) );
}
SET_BIT(GPIOA->BSRRH,
0
b
10000
); //Sets pin
4
low
}
}
#spi-registers-dr-helpmeclive
- Labels:
-
SPI
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2014-08-21 9:48 AM
Don't expect the debugger to show you the content of a write-only data register you have written. It's not a memory cell, and it's not visible to you. Observe the data at the pin.
Up vote any posts that you find helpful, it shows what's working..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2014-08-21 10:01 AM
I've been looking at the output pins with an oscilloscope, and I'm not seeing data or clock out. Thank you for the tip on the data register, I didn't realize that.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2014-08-21 10:26 AM
I'm not up for wading through register level code, trying using the Standard Library to configure the pins, mux, peripherals.
Up vote any posts that you find helpful, it shows what's working..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2014-08-21 10:35 AM
I looked into that, but I'm currently working in CrossStudio and the stm32f3xx_spi and gpio files didn't come with any of the packages.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2014-08-21 12:03 PM
Red Download Button, bottom of the page
http://www.st.com/web/en/catalog/tools/PF259429
Up vote any posts that you find helpful, it shows what's working..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2014-08-21 11:51 PM
''I'm currently working in CrossStudio''
That's Rowley: - yes?''the stm32f3xx_spi and gpio files didn't come with any of the packages''So download them from ST, then!