Skip to content

Commit 9ffe198

Browse files
SPI polarity on stm32f1 and f4
1 parent d8b9dd9 commit 9ffe198

File tree

9 files changed

+103
-12
lines changed

9 files changed

+103
-12
lines changed

examples/inemom1/gyro/gyro.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,14 @@ void initGyro()
1414
pin_t mosi = make_pin(gpio_port_b, 15);
1515
pin_t miso = make_pin(gpio_port_b, 14);
1616
pin_t cs = make_pin(gpio_port_b, 12);
17-
ssp_port_t gyroport = { .ssp = ssp_2, .sclk = sclk, .mosi = mosi, .miso = miso };
17+
ssp_port_t gyroport = {
18+
.ssp = ssp_2,
19+
.sclk = sclk,
20+
.mosi = mosi,
21+
.miso = miso,
22+
.mode = ssp_master,
23+
.polarity = ssp_polarity_mode_0
24+
};
1825

1926
if (!l3gd20_init_ssp(&gyro, gyroport, cs))
2027
printf("Cannot initialize gyroscope");

examples/stm32f429discovery/charlcd/charlcd.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,15 @@ int main() {
1919
pin_t rw = { .port = gpio_port_f, .pin = 13 };
2020
pin_t e = { .port = gpio_port_c, .pin = 6 };
2121

22-
ssp_port_t ssp = { .ssp = ssp_3, .sclk = sclk, .mosi = mosi, .miso = miso};
22+
ssp_port_t ssp = {
23+
.ssp = ssp_3,
24+
.sclk = sclk,
25+
.mosi = mosi,
26+
.miso = miso,
27+
.ss = PIN_NULL,
28+
.mode = ssp_master,
29+
.polarity = ssp_polarity_mode_0
30+
};
2331

2432
if (!lcd_init(&lcd, ssp, cs, rs, rw, e))
2533
{

examples/stm32f429discovery/gyro/gyro.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,13 @@ int main() {
2727
pin_t miso = { .port = gpio_port_f, .pin = 8 };
2828
pin_t cs = { .port = gpio_port_c, .pin = 1 };
2929

30-
ssp_port_t ssp = { .ssp = ssp_5, .sclk = sclk, .mosi = mosi, .miso = miso };
30+
ssp_port_t ssp = {
31+
.ssp = ssp_5,
32+
.sclk = sclk,
33+
.mosi = mosi,
34+
.miso = miso,
35+
.mode = ssp_master,
36+
.polarity = ssp_polarity_mode_0 };
3137

3238
if (!l3gd20_init_ssp(&l3gd20, ssp, cs))
3339
{

examples/stm32f429discovery/spimaster/spimaster.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,19 @@ int main(){
3030
gpio_config(led2, pin_dir_write, pull_down);
3131

3232
//SPI4
33-
pin_t sck = make_pin(gpio_port_e, 2);
33+
pin_t sclk = make_pin(gpio_port_e, 2);
3434
pin_t miso = make_pin(gpio_port_e, 5);
3535
pin_t mosi = make_pin(gpio_port_e, 6);
36-
ssp_port_t master = { .sclk = sck, .mosi = mosi, .miso = miso, .ss = PIN_NULL, .mode = ssp_master, .ssp = ssp_4 };
36+
37+
ssp_port_t master = {
38+
.ssp = ssp_4,
39+
.sclk = sclk,
40+
.mosi = mosi,
41+
.miso = miso,
42+
.ss = PIN_NULL,
43+
.mode = ssp_master,
44+
.polarity = ssp_polarity_mode_0
45+
};
3746
ssp_config(master, 8000000);
3847

3948
//user button on PA0

examples/stm32f429discovery/spislave/spislave.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,19 @@ int main(){
3838
gpio_config(led2, pin_dir_write, pull_down);
3939

4040
//SPI4
41-
pin_t sck = make_pin(gpio_port_e, 2);
41+
pin_t sclk = make_pin(gpio_port_e, 2);
4242
pin_t miso = make_pin(gpio_port_e, 5);
4343
pin_t mosi = make_pin(gpio_port_e, 6);
44-
ssp_port_t slave = { .sclk = sck, .mosi = mosi, .miso = miso, .ss = PIN_NULL, .mode = ssp_slave, .ssp = ssp_4 };
44+
45+
ssp_port_t slave = {
46+
.ssp = ssp_4,
47+
.sclk = sclk,
48+
.mosi = mosi,
49+
.miso = miso,
50+
.ss = PIN_NULL,
51+
.mode = ssp_master,
52+
.polarity = ssp_polarity_mode_0
53+
};
4554
ssp_config(slave, 8000000);
4655

4756
//SSP slave callbacks

examples/stm32f4discovery/accel/accel.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,15 @@ int main() {
2626
pin_t miso = { .port = gpio_port_a, .pin = 6 };
2727
pin_t cs = { .port = gpio_port_e, .pin = 3 };
2828

29-
ssp_port_t ssp = { .ssp = ssp_1, .sclk = sclk, .mosi = mosi, .miso = miso };
29+
ssp_port_t ssp = {
30+
.ssp = ssp_1,
31+
.sclk = sclk,
32+
.mosi = mosi,
33+
.miso = miso,
34+
.ss = PIN_NULL,
35+
.mode = ssp_master,
36+
.polarity = ssp_polarity_mode_0
37+
};
3038

3139
lis3dsh_init_ssp(&lis3dsh, ssp, cs);
3240

hardware/include/ssp.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ typedef enum {
2121
ssp_master,
2222
} ssp_mode_t;
2323

24+
typedef enum {
25+
ssp_polarity_mode_0, // CPOL=0; CPHA=0
26+
ssp_polarity_mode_1, // CPOL=0; CPHA=1
27+
ssp_polarity_mode_2, // CPOL=1; CPHA=0
28+
ssp_polarity_mode_3, // CPOL=1; CPHA=1
29+
} ssp_polarity_t;
30+
2431
typedef enum {
2532
event_read,
2633
event_write,
@@ -32,6 +39,7 @@ typedef struct {
3239
pin_t miso;
3340
pin_t ss;
3441
ssp_mode_t mode;
42+
ssp_polarity_t polarity;
3543
ssp_t ssp;
3644
} ssp_port_t;
3745

hardware/src/stm32f10x/ssp.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ void ssp_config(ssp_port_t ssp_port, uint32_t clock)
3535
pin_t sclk = ssp_port.sclk;
3636
pin_t miso = ssp_port.miso;
3737
pin_t mosi = ssp_port.mosi;
38+
ssp_polarity_t polarity = ssp_port.polarity;
3839

3940
SPI_TypeDef * id = spis[ssp];
4041

@@ -68,8 +69,25 @@ void ssp_config(ssp_port_t ssp_port, uint32_t clock)
6869
spidef.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
6970
spidef.SPI_Mode = SPI_Mode_Master;
7071
spidef.SPI_DataSize = SPI_DataSize_8b;
71-
spidef.SPI_CPOL = SPI_CPOL_Low;
72-
spidef.SPI_CPHA = SPI_CPHA_1Edge;
72+
switch(polarity)
73+
{
74+
case ssp_polarity_mode_0:
75+
spidef.SPI_CPOL = SPI_CPOL_Low;
76+
spidef.SPI_CPHA = SPI_CPHA_1Edge;
77+
break;
78+
case ssp_polarity_mode_1:
79+
spidef.SPI_CPOL = SPI_CPOL_Low;
80+
spidef.SPI_CPHA = SPI_CPHA_2Edge;
81+
break;
82+
case ssp_polarity_mode_2:
83+
spidef.SPI_CPOL = SPI_CPOL_High;
84+
spidef.SPI_CPHA = SPI_CPHA_1Edge;
85+
break;
86+
case ssp_polarity_mode_3:
87+
spidef.SPI_CPOL = SPI_CPOL_High;
88+
spidef.SPI_CPHA = SPI_CPHA_2Edge;
89+
break;
90+
}
7391
spidef.SPI_NSS = SPI_NSS_Soft;
7492
spidef.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
7593
spidef.SPI_FirstBit = SPI_FirstBit_MSB;

hardware/src/stm32f4xx/ssp.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ static __inline__ uint16_t compute_prescaler(uint32_t clock) {
3434
void ssp_config(ssp_port_t ssp_port, uint32_t clock) {
3535
ssp_t ssp = ssp_port.ssp;
3636
ssp_mode_t mode = ssp_port.mode;
37+
ssp_polarity_t polarity = ssp_port.polarity;
3738
pin_t sclk = ssp_port.sclk;
3839
pin_t miso = ssp_port.miso;
3940
pin_t mosi = ssp_port.mosi;
@@ -91,8 +92,25 @@ void ssp_config(ssp_port_t ssp_port, uint32_t clock) {
9192
SPI_I2S_DeInit(id);
9293
spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
9394
spi.SPI_DataSize = SPI_DataSize_8b;
94-
spi.SPI_CPOL = SPI_CPOL_Low;
95-
spi.SPI_CPHA = SPI_CPHA_1Edge;
95+
switch(polarity)
96+
{
97+
case ssp_polarity_mode_0:
98+
spi.SPI_CPOL = SPI_CPOL_Low;
99+
spi.SPI_CPHA = SPI_CPHA_1Edge;
100+
break;
101+
case ssp_polarity_mode_1:
102+
spi.SPI_CPOL = SPI_CPOL_Low;
103+
spi.SPI_CPHA = SPI_CPHA_2Edge;
104+
break;
105+
case ssp_polarity_mode_2:
106+
spi.SPI_CPOL = SPI_CPOL_High;
107+
spi.SPI_CPHA = SPI_CPHA_1Edge;
108+
break;
109+
case ssp_polarity_mode_3:
110+
spi.SPI_CPOL = SPI_CPOL_High;
111+
spi.SPI_CPHA = SPI_CPHA_2Edge;
112+
break;
113+
}
96114
if (valid_pin(ss))
97115
spi.SPI_NSS = SPI_NSS_Soft;
98116
else

0 commit comments

Comments
 (0)