Re: SPI send data

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 06/30/2011 04:20 PM, jayant biswas wrote:
> It's been a while since the last message. But I am still stuck on this
> problem, which means that I am unable to control the programmable
> potentiometer AD8400. So I have tried to check the pins with a logic
> analyzer and it appears that I do not see any SPI clock. That is to
> say that the pin PA5 is always low. As is the pin PA7. And PA8 is
> always high. This pins correspond to the descriptions in the STM3210E
> eval board http://www.st.com/stonline/products/literature/um/14220.pdf
> . Am I missing some initialization step that should start off the
> clock?
>
> I have attached my code with this message. Please let me know if you
> need more information.
>
> Thank you,
> Jayant
>
> On Wed, Jun 1, 2011 at 19:19, Ilija Stanislevik <ilijas@xxxxxxxxxxx> wrote:
>> 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>
>>
>>
Hi,

Did you retry the test with MISO, MOSI lines shorted (loop back)?

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 of Archives]     [Linux Embedded]     [U-Boot V2]     [Linux Kernel]     [Linux MIPS]     [Linux ARM]     [Linux for the Blind]     [Yosemite]     [ISDN Cause Codes]     [eCos Home]

  Powered by Linux