@@ -63,7 +63,7 @@ static void avr_spi_bitbang_switch_mode(avr_spi_t * p, uint8_t master)
6363 irq = avr_io_getirq ( p -> bit_bang .avr ,
6464 AVR_IOCTL_IOPORT_GETIRQ (p -> p_miso .port ),
6565 IOPORT_IRQ_DIRECTION_ALL );
66- irq_val = irq -> value & (1 << p -> p_miso .pin );
66+ irq_val = irq -> value & ~ (1 << p -> p_miso .pin );
6767 avr_raise_irq (irq , irq_val );
6868 p -> bit_bang .clk_generate = 1 ;
6969 } else {
@@ -74,17 +74,17 @@ static void avr_spi_bitbang_switch_mode(avr_spi_t * p, uint8_t master)
7474 irq = avr_io_getirq ( p -> bit_bang .avr ,
7575 AVR_IOCTL_IOPORT_GETIRQ (p -> bit_bang .p_clk .port ),
7676 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 );
7878 avr_raise_irq (irq , irq_val );
7979 irq = avr_io_getirq ( p -> bit_bang .avr ,
8080 AVR_IOCTL_IOPORT_GETIRQ (p -> p_mosi .port ),
8181 IOPORT_IRQ_DIRECTION_ALL );
82- irq_val = irq -> value & (1 << p -> p_mosi .pin );
82+ irq_val = irq -> value & ~ (1 << p -> p_mosi .pin );
8383 avr_raise_irq (irq , irq_val );
8484 irq = avr_io_getirq ( p -> bit_bang .avr ,
8585 AVR_IOCTL_IOPORT_GETIRQ (p -> p_ss .port ),
8686 IOPORT_IRQ_DIRECTION_ALL );
87- irq_val = irq -> value & (1 << p -> p_ss .pin );
87+ irq_val = irq -> value & ~ (1 << p -> p_ss .pin );
8888 avr_raise_irq (irq , irq_val );
8989 p -> bit_bang .clk_generate = 0 ;
9090 }
@@ -135,6 +135,7 @@ static void avr_spi_write(struct avr_t * avr, avr_io_addr_t addr, uint8_t v, voi
135135 avr_core_watch_write (avr , addr , v );
136136 avr_bitbang_stop (& (p -> bit_bang ));
137137 avr_bitbang_reset (avr , & (p -> bit_bang ));
138+ p -> bit_bang .data = p -> output_data_register ;
138139 if (avr_regbit_get (avr , p -> spe )) {
139140 p -> bit_bang .clk_phase = avr_regbit_get (avr , p -> cpha );
140141 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
180181 avr_bitbang_stop (& (p -> bit_bang ));
181182 avr_bitbang_reset (p -> bit_bang .avr , & (p -> bit_bang ));
182183 } 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 ));
184186 }
185187 }
186188}
0 commit comments