Как использовать TSL2301 и сделать задержку часов в usart

Я работаю над ПЗС-датчиком линейного сканирования с именем TSL2301. Я хочу считывать пиксели с помощью USART stm32f103, но всегда могу получить 0xFF. Кто-нибудь работал с этим датчиком, чтобы помочь мне? Я использовал синхронный режим Usart STM32f10x, я отправил некоторый заказ на датчик с помощью Usart и хочу сделать 8-часовую задержку после каждого заказа. как мне это сделать?

int count=0;
int i=0;
uint8_t data[102]={0};
USART_ClockInitStructure.USART_Clock = USART_Clock_Enable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_High;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Enable;
USART_ClockInit(USARTy, &USART_ClockInitStructure);

USART_InitStructure.USART_BaudRate = 2200000;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USARTy, &USART_InitStructure);

/* Configure the USARTy */
USART_Init(USARTy, &USART_InitStructure);

/* Enable the USARTy */
USART_Cmd(USARTy, ENABLE);

while(1)
{
while(count < 3)       
{                                               
USART_SendData(USARTy,0xFF);
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET);
count++;
}
count=0;
USART_SendData(USARTy,0x1b);      //RESET command
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET);

USART_SendData(USARTy,0x1b);
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET);

USART_SendData(USARTy,0x1b);
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET);

USART_SendData(USARTy,0x08);  //StartInt Command
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET);

while(count < 20 )//DelayIntegrationTime() ;
{
USART_SendData(USARTy,0xFF);
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET);
count++;
}
count = 0;  
USART_SendData(USARTy,0x10);    //SampleInt Command
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET);

USART_SendData(USARTy,0x02);        //ReadPixel Command
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET);

while(count < 2)
{
USART_SendData(USARTy,0xFF);
while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET);
count++;
}
count = 0;

 USART_Cmd(USARTy, DISABLE);
 USART_ClockInitStructure.USART_CPOL = USART_CPOL_High;
 USART_ClockInitStructure.USART_CPHA = USART_CPHA_1Edge;
 USART_ClockInit(USARTy, &USART_ClockInitStructure);
 USART_Init(USARTy, &USART_InitStructure);
 USART_Cmd(USARTy, ENABLE);

/*read pixels*/
for (i = 0; i < 102; i++) 
{
   while(USART_GetFlagStatus(USARTy, USART_FLAG_RXNE) == RESET);
   data[i] = USART_ReceiveData(USARTy);
   while(count < 1) 
   {
   USART_SendData(USARTy,0xFF);
   while(USART_GetFlagStatus(USARTy, USART_FLAG_TC) == RESET);
   count++;
   }
   count = 0;
 }

 USART_Cmd(USARTy, DISABLE);
 USART_ClockInitStructure.USART_CPOL = USART_CPOL_High;
 USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
 USART_ClockInit(USARTy, &USART_ClockInitStructure);
 USART_Init(USARTy, &USART_InitStructure);
 USART_Cmd(USARTy, ENABLE);

}


person Mahtab    schedule 20.07.2014    source источник


Ответы (1)


В справочном руководстве STM32F103 и техническом описании TAOS есть разные временные диаграммы USART. Я думаю, они не будут работать вместе в режиме USART.

Как идея можно попробовать использовать UART вместо USART. И синхронизируйте устройство, используя MCO или другой источник синхронизации. Я думаю, это должно сработать.

В этом случае все задержки можно сделать с помощью таймера.

PS: Но есть еще одна проблема, которую вы должны решить, это синхронизировать вывод UART с источником тактового сигнала. Мне нужно более внимательно прочитать руководство по stm32, чтобы рассказать вам, как это сделать. я сделаю это позже

person picoworm    schedule 23.07.2014
comment
У меня есть для вас странное решение. Теоретически должно работать, но проверить не могу. Итак, сначала оборудование. Вы должны рассчитать максимальную частоту, которую может принять приемник UART. Это должно быть около 1 Мбит / с. Во-вторых, вы должны настроить таймер на этой частоте и сделать тактовый сигнал для датчика, а также подключить его к SPI clk MCU. Да, вы должны использовать SPI для отправки синхронных данных. Вывод SPI MISO должен быть подключен к последовательному входу датчика. - person picoworm; 23.07.2014
comment
SPI Должен быть настроен как ведомый и иметь 16-битный кадр данных. Вы должны установить регистр SPI в 0xffff, чтобы сделать вывод IDLE USART. Когда вам нужно отправить данные, вы должны построить 1 стартовый бит, чем данные, затем стоповый бит, это должно занять 10 бит регистра данных SPI, 6 бит, которые остаются равными 1 - person picoworm; 23.07.2014
comment
Может быть, это трудно понять. Основная идея — использовать UART только для получения данных. И SPI для отправки данных. Вы также можете попробовать использовать тактовый сигнал SPI и запустить SPI в ведущем режиме. Это будет работать, но вы всегда должны отправлять данные FFFF для генерации тактового сигнала. - person picoworm; 23.07.2014
comment
Надеюсь, эти комментарии будут вам полезны - person picoworm; 23.07.2014
comment
Я рекомендую вам сначала работать без внешней периферии, использовать GPIO только с более низкими частотами. Попробуйте получить некоторую информацию от датчика. Только после этого делайте это с помощью быстрых аппаратных сдвиговых регистров. После того, как все заработает, вы можете использовать DMA как на UART, так и на SPI и освободить процессор для других задач. - person picoworm; 23.07.2014