Перейти к содержанию
    

клок передачи данных SPI

Настроил SPI как мастер, передаю данные. на ноге MOSI данные есть, на MISO нету. Глянул ногу CLK осциллографом - удивился(см. фото)

Что может быть не так?

 

Код инициализации клока SPI:

 

SPIClkConfigure(SOC_SPI_1_REGS, 150000000, 10000000, SPI_DATA_FORMAT0);

 

тело функции

 

void SPIClkConfigure(unsigned int baseAdd, unsigned int moduleClk,
                    unsigned int spiClk, unsigned int dataFormat)
{
   unsigned int prescale;

   prescale = (moduleClk/spiClk) + 1;

   HWREG(baseAdd + SPI_SPIFMT(dataFormat)) =  \
       (SPI_SPIFMT_PRESCALE & (prescale << SPI_SPIFMT_PRESCALE_SHIFT));
}

post-72052-1416162302_thumb.jpg

Изменено пользователем Dubov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разве на ногу MISO не должно данные выдавать внешнее устройство. Если оно не подключено, или висит, или у него не работает SPI.

Вот оно и не отвечает. Может чип селект не заведен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что может быть не так?

Да вроде, все так. Вы же данные передаете, вот они на MOSI и идут. А что не так то? Частота CLK? По этой части, либо у Вас тактируется SPI не тем, о чем Вы думаете, либо коэффициент деления не туда заносится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Частота клока должна быть 10Мгц (судя по коду). На фото сами видите что гараздо больше. АЦП с которого данные должшы передаваться принимает чипселект и генерит прерывание для процессора. А данные не идут...

Тот клок что видно на осциллографе слишком высокий по частоте. Ацп работает с клоком передачи данных не больше 20кГц.

 

 

Частота клока должна быть 10Мгц (судя по коду). На фото сами видите что гараздо больше. АЦП с которого данные должшы передаваться принимает чипселект и генерит прерывание для процессора. А данные не идут...

Тот клок что видно на осциллографе слишком высокий по частоте. Ацп работает с клоком передачи данных не больше 20кГц.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во первых, не видно, где, собственно, задается DFSEL=0 при передаче. А то, может быть, Вы data format #0 определяете, а используете #2.

Во вторых, совершенно непонятно, на сколько верны всевозможные макросы, соответствуют ли реальным адресам.

В третьих, совершенно непонятно из кода, какая реальная частота идет на тактирование модуля.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во первых, не видно, где, собственно, задается DFSEL=0 при передаче. А то, может быть, Вы data format #0 определяете, а используете #2.

Во вторых, совершенно непонятно, на сколько верны всевозможные макросы, соответствуют ли реальным адресам.

В третьих, совершенно непонятно из кода, какая реальная частота идет на тактирование модуля.

 

 

Я использую StarterWare. Функция инициализации SPI:

 

static void SPI_init(void)
{
unsigned int  val = 0xE00; // 3-wire mode

// Waking up the SPI1 instance

   PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_SPI1, PSC_POWERDOMAIN_ALWAYS_ON,
                     PSC_MDCTL_NEXT_ENABLE);
   SPIPinMuxSetup(1);

   SPIReset(SOC_SPI_1_REGS);

   SPIOutOfReset(SOC_SPI_1_REGS);

   SPIModeConfigure(SOC_SPI_1_REGS, SPI_MASTER_MODE);

   SPIClkConfigure(SOC_SPI_1_REGS, 150000000, SPI_CLK, SPI_DATA_FORMAT0);

   SPIPinControl(SOC_SPI_1_REGS, 0, 0, &val);

// Configures SPI Data Format Register
   /* Configures the polarity and phase of SPI clock */
    SPIConfigClkFormat(SOC_SPI_1_REGS,
                          (SPI_CLK_POL_HIGH | SPI_CLK_INPHASE),
                          SPI_DATA_FORMAT0);

   /* Configures SPI to transmit MSB bit First during data transfer */
    SPIShiftMsbFirst(SOC_SPI_1_REGS, SPI_DATA_FORMAT0);

   /* Sets the Charcter length */
    SPICharLengthSet(SOC_SPI_1_REGS, CHAR_LENGTH, SPI_DATA_FORMAT0);

    SPIDat1Config(SOC_SPI_1_REGS, SPI_DATA_FORMAT0, 0x1);
    GPIOPinWrite(SOC_GPIO_0_REGS, 48, GPIO_PIN_HIGH);
// Enable SPI communication
   SPIEnable(SOC_SPI_1_REGS);

}

 

CS я дёргаю руками через GPIO. просто выставляю перед отправкой "0", после отправки "1". Так и не понял как аппаратно его задать. Но не суть.

 

Настройка SPIDat1

 

/**
* \brief - Configures the SPIDat1 Register.It won't write to TX part
*            of the SPIDat1 Register.\n
*
* \param - baseAdd  is the Memory Address of the SPI data instance used.\n
* \param - flag is value to Configure CSHOL,Wait Delay Conter Enable bit
*          and to select the appropriate DataFormat register.\n
*
*         flag can take following values.\n
*
*         SPI_CSHOLD            - To Hold the CS line active after data Transfer
*                                 untill new data and Control information is
*                                 loaded.\n
*
*         SPI_DELAY_COUNTER_ENA - Enables Delay Counter.\n
*
*         SPI_DATA_FORMAT0      - To select DataFormat Register 0.\n
*         SPI_DATA_FORMAT1      - To select DataFormat Register 1.\n
*         SPI_DATA_FORMAT2      - To select DataFormat Register 2.\n
*         SPI_DATA_FORMAT3      - To select DataFormat Register 3.\n
*
* \param - cs is the value to driven on CS pin(line).\n
*
* \return none.
**/
void SPIDat1Config(unsigned int baseAdd, unsigned int flag, unsigned char cs)
{
   unsigned char *ptr = (unsigned char*)(baseAdd + SPI_SPIDAT1);
   unsigned char dcs;

   *(ptr+3) = (char)((flag >> 24) | (flag & (SPI_SPIDAT1_DFSEL >>
                                     SPI_SPIDAT1_DFSEL_SHIFT)));

   dcs = HWREG(baseAdd + SPI_SPIDEF ) & (SPI_SPIDEF_CSDEF);

   *(ptr+2) = cs ^ dcs;
}

 

функция вызываемая в прерывании от внешнего АЦП

 

void SWI_ADСrecv()
{
int i = 0;
static int j = 0;

GPIOPinWrite(SOC_GPIO_0_REGS, 48, GPIO_PIN_LOW);

for(i=0; i<16;i++)
{
            SPITransmitData1(SOC_SPI_1_REGS, dummy);
    		while(HWREG(SOC_SPI_1_REGS + SPI_SPIBUF)&SPI_SPIBUF_RXEMPTY);
    		PongBuf[j] = SPIDataReceive(SOC_SPI_1_REGS);
    		j++;
    		if(j == 2048) j = 0;
}

GPIOPinWrite(SOC_GPIO_0_REGS, 48, GPIO_PIN_HIGH);

}

Изменено пользователем Dubov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После всех настроек посмотрите отладчиком, что в регистрах реально записалось. Подозреваю, что тут какие-то нестыковки с индексами. Например, индексы-макросы рассчитаны на индексацию типа (int*), а вы их прибавляете как байтовые смещения, ну или наоборот, или что-то в этом роде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...