@@ -63,7 +63,7 @@ static void avr_spi_bitbang_switch_mode(avr_spi_t * p, uint8_t master)
63
63
irq = avr_io_getirq ( p -> bit_bang .avr ,
64
64
AVR_IOCTL_IOPORT_GETIRQ (p -> p_miso .port ),
65
65
IOPORT_IRQ_DIRECTION_ALL );
66
- irq_val = irq -> value & (1 << p -> p_miso .pin );
66
+ irq_val = irq -> value & ~ (1 << p -> p_miso .pin );
67
67
avr_raise_irq (irq , irq_val );
68
68
p -> bit_bang .clk_generate = 1 ;
69
69
} else {
@@ -74,17 +74,17 @@ static void avr_spi_bitbang_switch_mode(avr_spi_t * p, uint8_t master)
74
74
irq = avr_io_getirq ( p -> bit_bang .avr ,
75
75
AVR_IOCTL_IOPORT_GETIRQ (p -> bit_bang .p_clk .port ),
76
76
IOPORT_IRQ_DIRECTION_ALL );
77
- irq_val = irq -> value & (1 << p -> bit_bang .p_clk .pin );
77
+ irq_val = irq -> value & ~ (1 << p -> bit_bang .p_clk .pin );
78
78
avr_raise_irq (irq , irq_val );
79
79
irq = avr_io_getirq ( p -> bit_bang .avr ,
80
80
AVR_IOCTL_IOPORT_GETIRQ (p -> p_mosi .port ),
81
81
IOPORT_IRQ_DIRECTION_ALL );
82
- irq_val = irq -> value & (1 << p -> p_mosi .pin );
82
+ irq_val = irq -> value & ~ (1 << p -> p_mosi .pin );
83
83
avr_raise_irq (irq , irq_val );
84
84
irq = avr_io_getirq ( p -> bit_bang .avr ,
85
85
AVR_IOCTL_IOPORT_GETIRQ (p -> p_ss .port ),
86
86
IOPORT_IRQ_DIRECTION_ALL );
87
- irq_val = irq -> value & (1 << p -> p_ss .pin );
87
+ irq_val = irq -> value & ~ (1 << p -> p_ss .pin );
88
88
avr_raise_irq (irq , irq_val );
89
89
p -> bit_bang .clk_generate = 0 ;
90
90
}
@@ -135,6 +135,7 @@ static void avr_spi_write(struct avr_t * avr, avr_io_addr_t addr, uint8_t v, voi
135
135
avr_core_watch_write (avr , addr , v );
136
136
avr_bitbang_stop (& (p -> bit_bang ));
137
137
avr_bitbang_reset (avr , & (p -> bit_bang ));
138
+ p -> bit_bang .data = p -> output_data_register ;
138
139
if (avr_regbit_get (avr , p -> spe )) {
139
140
p -> bit_bang .clk_phase = avr_regbit_get (avr , p -> cpha );
140
141
p -> bit_bang .clk_pol = avr_regbit_get (avr , p -> cpol );
@@ -180,7 +181,8 @@ static void avr_spi_ss_hook(struct avr_irq_t * irq, uint32_t value, void * param
180
181
avr_bitbang_stop (& (p -> bit_bang ));
181
182
avr_bitbang_reset (p -> bit_bang .avr , & (p -> bit_bang ));
182
183
} else {
183
- avr_bitbang_start (& (p -> bit_bang ));
184
+ if (avr_regbit_get (p -> bit_bang .avr , p -> spe ))
185
+ avr_bitbang_start (& (p -> bit_bang ));
184
186
}
185
187
}
186
188
}
0 commit comments