Index: trunk/modules/vci_spi/caba/source/include/vci_spi.h
===================================================================
--- trunk/modules/vci_spi/caba/source/include/vci_spi.h	(revision 564)
+++ trunk/modules/vci_spi/caba/source/include/vci_spi.h	(revision 565)
@@ -79,10 +79,11 @@
     sc_signal<uint8_t>                 r_ctrl_char_len; // number of bits in xfer
 
-    sc_signal<uint32_t>		       r_bit_count;
-    sc_signal<uint32_t>		       r_clk_counter;
+    sc_signal<uint32_t>		       r_spi_bit_count;
+    sc_signal<uint32_t>		       r_spi_clk_counter;
     sc_signal<bool>		       r_spi_clk;
     sc_signal<bool>		       r_spi_clk_previous;
     sc_signal<bool>		       r_spi_clk_ignore;
     sc_signal<bool>		       r_spi_out;
+    sc_signal<bool>		       r_spi_done;
     sc_signal<bool>		       r_irq;
 
Index: trunk/modules/vci_spi/caba/source/src/vci_spi.cpp
===================================================================
--- trunk/modules/vci_spi/caba/source/src/vci_spi.cpp	(revision 564)
+++ trunk/modules/vci_spi/caba/source/src/vci_spi.cpp	(revision 565)
@@ -55,6 +55,7 @@
 	r_ctrl_cpha       = false;
 	r_ctrl_go_bsy     = false;
-	r_clk_counter     = 0xffff;
+	r_spi_clk_counter     = 0xffff;
 	r_spi_clk	 = 0;
+	r_spi_done        = false;
 
 	r_irq		  = false;
@@ -68,4 +69,7 @@
     // r_target_fsm, r_irq_enable, r_nblocks, r_buf adress, r_lba, r_go, r_read
     //////////////////////////////////////////////////////////////////////////////
+
+    if (r_spi_done)
+	r_ctrl_go_bsy = false;
 
     switch(r_target_fsm) {
@@ -210,13 +214,15 @@
     // the SPI FSM controls SPI signals
     //////////////////////////////////////////////////////////////////////////////
+    if (r_ctrl_go_bsy == false)
+	r_spi_done = false;
     switch (r_spi_fsm) {
     case S_IDLE:
-	r_clk_counter = r_divider.read();
+	r_spi_clk_counter = r_divider.read();
 	r_spi_clk = 0;
 	r_spi_clk_previous = r_ctrl_cpha;
 	r_spi_clk_ignore = r_ctrl_cpha;
-	r_bit_count = r_ctrl_char_len;
+	r_spi_bit_count = r_ctrl_char_len;
 	r_spi_out = (r_txrx[(r_ctrl_char_len -1)/ 64] >> ((r_ctrl_char_len - 1) % 64)) & (uint64_t)0x0000000000000001ULL;
-	if (r_ctrl_go_bsy.read())
+	if (r_ctrl_go_bsy.read() && !r_spi_done.read())
 		r_spi_fsm = S_XMIT;
 	break;
@@ -231,11 +237,11 @@
 		r_txrx[1] = (r_txrx[1] << 1) | (r_txrx[0] >> 63);
 		r_txrx[0] = (r_txrx[0] << 1) | p_spi_miso;
-		r_bit_count = r_bit_count - 1;
+		r_spi_bit_count = r_spi_bit_count - 1;
 	    } else if (r_spi_clk_previous == 1 && s_clk_sample == 0) {
 		// high to low transition: change output, or stop
-		if (r_bit_count == 0) {
+		if (r_spi_bit_count == 0) {
 		    r_spi_fsm = S_IDLE;
 		    r_irq = r_ctrl_ie;
-		    r_ctrl_go_bsy = false;
+		    r_spi_done = true;
 #ifdef SOCLIB_MODULE_DEBUG0
 		    std::cout << name() << " end xfer " << std::dec << (int)r_ctrl_char_len.read() << " data " << std::hex << r_txrx[1] << " " << r_txrx[0] << std::endl;
@@ -248,10 +254,10 @@
 	r_spi_clk_previous = s_clk_sample;
 	// generate the SPI clock
-	if (r_clk_counter.read() == 0) {
-	    r_clk_counter = r_divider.read();
+	if (r_spi_clk_counter.read() == 0) {
+	    r_spi_clk_counter = r_divider.read();
 	    r_spi_clk = !r_spi_clk.read();
 	    r_spi_clk_ignore = false;
 	} else {
-	    r_clk_counter = r_clk_counter.read() - 1;
+	    r_spi_clk_counter = r_spi_clk_counter.read() - 1;
 	}
 	break;
@@ -766,6 +772,6 @@
 	    << std::endl;
 	std::cout << name() << " _SPI : " << spi_str[r_spi_fsm.read()] 
-	    << " clk_counter " << r_clk_counter.read()
-	    << " r_bit_count " << r_bit_count.read() 
+	    << " clk_counter " << r_spi_clk_counter.read()
+	    << " r_spi_bit_count " << r_spi_bit_count.read() 
 	    << " r_ctrl_go_bsy " << (int)r_ctrl_go_bsy.read() << std::endl;
 	std::cout << name() << " _SPI : "
