This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: SPI send data


On 06/01/2011 11:02 AM, jayant biswas wrote:
> Hi Ilija,
>
> Thank you for your response to the previous question, I am using SPI1
> and have changed the config accordingly and have noticed with a
> voltmeter that the pin PA8 does stay high and goes low when the SPI is
> active. I have another question now about sending data. If you take a
> look at the timing diagrams on page 10 of the datasheet
> (http://www.analog.com/static/imported-files/data_sheets/AD8400_8402_8403.pdf)
> for the programmable potentiometer that I am using and then my code
> below, could you maybe hint at what I am doing wrong?
>
> Regards,
> Jayant
>
> So this code based on the loopback test that comes with the spi package in ecos.
>
> #include <cyg/infra/cyg_type.h>
> #include <cyg/infra/testcase.h>         // Test macros
> #include <cyg/infra/cyg_ass.h>          // Assertion macros
> #include <cyg/infra/diag.h>             // Diagnostic output
>
> #include <cyg/hal/hal_arch.h>           // CYGNUM_HAL_STACK_SIZE_TYPICAL
> #include <cyg/kernel/kapi.h>
>
> #include <cyg/io/spi.h>                 // Common SPI API
> #include <cyg/io/spi_stm32.h>           // STM32 data structures
>
> #include <string.h>
>
> //---------------------------------------------------------------------------
> // Thread data structures.
>
> cyg_uint8 stack [CYGNUM_HAL_STACK_SIZE_TYPICAL];
> cyg_thread thread_data;
> cyg_handle_t thread_handle;
>
> externC cyg_spi_cortexm_stm32_bus_t cyg_spi_stm32_bus2;
>
> //---------------------------------------------------------------------------
> // SPI loopback device driver data structures.
>
> cyg_spi_cortexm_stm32_device_t loopback_device = {
>     .spi_device.spi_bus = &cyg_spi_stm32_bus1.spi_bus,
>     .dev_num = 0 ,                      // Only 1 device.
>     .cl_pol = 1,
>     .cl_pha = 1,
>     .cl_brate = 8000000,                // Nominal 8Mhz.
>     .cs_up_udly = 1,
>     .cs_dw_udly = 1,
>     .tr_bt_udly = 1,
>     .bus_16bit = true, // *** MODIFIED this because my data is 10 bits
> };
>
> //---------------------------------------------------------------------------
>
> //const char tx_data[] = {0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1}; // To set
> maximum resistance at address 00
> const char tx_data[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // To set
> minimim resistance at address 00
> const char tx_data1[] = "Testing extended API...";
> const char tx_data2[] = "Testing extended API for a second transaction.";
>
> char rx_data [sizeof(tx_data)];
> char rx_data1 [sizeof(tx_data1)];
> char rx_data2 [sizeof(tx_data2)];
>
> //---------------------------------------------------------------------------
> // Run single loopback transaction using simple transfer API call.
>
> void run_test_1 (cyg_bool polled)
> {
>     diag_printf ("Test 1 : Simple transfer test (polled = %d).\n",
> polled ? 1 : 0);
>     cyg_spi_transfer (&loopback_device.spi_device, polled, sizeof (tx_data),
>         (const cyg_uint8*) &tx_data[0], (cyg_uint8*) &rx_data[0]);
>
>     diag_printf ("    Tx data : %s\n", tx_data);
>     diag_printf ("    Rx data : %s\n", rx_data);
>     CYG_ASSERT (memcmp (tx_data, rx_data, sizeof (tx_data)) == 0,
>         "Simple transfer loopback failed - mismatched data.\n");
> }
>
>
> //---------------------------------------------------------------------------
> // Run all PL022 SPI interface loopback tests.
>
> void run_tests (void)
> {
>     diag_printf ("Running STM32 SPI driver loopback tests.\n");
>     run_test_1 (true);
>     CYG_TEST_PASS_FINISH ("Loopback tests ran OK");
> }
>
> //---------------------------------------------------------------------------
> // User startup - tests are run in their own thread.
>
> void cyg_user_start(void)
> {
>     CYG_TEST_INIT();
>     cyg_thread_create(
>         10,                                   // Arbitrary priority
>         (cyg_thread_entry_t*) run_tests,      // Thread entry point
>         0,                                    //
>         "test_thread",                        // Thread name
>         &stack[0],                            // Stack
>         CYGNUM_HAL_STACK_SIZE_TYPICAL,        // Stack size
>         &thread_handle,                       // Thread handle
>         &thread_data                          // Thread data structure
>     );
>     cyg_thread_resume(thread_handle);
>     cyg_scheduler_start();
> }
>
> //=============================================================================
>
First you should change

    .cl_pol = 1,
    .cl_pha = 1,

into

    .cl_pol = 0,
    .cl_pha = 0,


in order to make STM32 SPI's timing compatible with potentiometer.

Note that with cyg_spi_transfer() you can send/receive bytes or 16bit
words, while your potentiometer expects 10bit words. You should take
care to pack your 10bit word in 16bits (two consecutive bytes) aligned
towards LS bit. That way STM32's SPI will clock out 6 unused bits at the
beginning so at the end of transaction your 10 bits will settle in right
place in potentiometer's shift register.

const char tx_data[] = {0,0xff}; // To set maximum resistance at address 00
const char tx_data[] = {0,0}; // To set minimum resistance at address 00


In your attempt you are packing a bit in each byte (char) which is wrong.

Also change

    .bus_16bit = true,

into

    .bus_16bit = false,

because you are sending/receiving in 8bit portions.

Regards,
-- 

Ilija Stanislevik
SIvA doo
ul. Mladinska 43 lok. 6
p.f. 53
MK-2400 Strumica
Macedonia

www.siva.mk <http://www.siva.mk>


-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]