如何使用TSL2301并使时钟延迟在usart



我正在研究一个名为TSL2301的行扫描ccd传感器。我想通过stm32f103的USART读取像素,但我总是只能接收0xFF,有人用这个传感器来帮助我吗?我使用STM32f10x的Usart同步模式,我通过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);

}

STM32F103参考手册和TAOS数据表中有不同的USART时序图。我认为它们在USART模式下不会一起工作。

作为一种想法,您可以尝试使用UART而不是USART。并使用MCO或其他时钟源对设备进行时钟控制。我想它应该能行。

在这种情况下,你可以用定时器来处理所有的延迟。

PS:但还有一个问题你应该解决,是同步输出与时钟源的UART。我需要阅读stm32手册更仔细地告诉你如何做到这一点。我待会再做

最新更新