3

我正在研究一个名为 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);

}

4

1 回答 1

0

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

作为一个想法,您可以尝试使用 UART 而不是 USART。并使用 MCO 或其他时钟源为设备提供时钟。我认为它应该工作。

在这种情况下,您可以使用计时器进行所有延迟。

PS:但是还有一个问题你应该解决,就是同步UART的输出和时钟源。我需要更仔细地阅读 stm32 手册来告诉你如何去做。我稍后会做

于 2014-07-23T11:27:26.947 回答