2014-07-20 39 views
3

我正在一個名爲TSL2301的線掃描ccd傳感器。我想通過USART讀取像素爲stm32f103,但總是我只能接收到0xFF,是否有人使用此傳感器來幫助我? 我使用了Usart同步模式的STM32f10x,我向Usart發送了一些命令給傳感器,並且想要在每個命令後進行8個時鐘延遲。我該怎麼做?如何使用TSL2301,並使時鐘延遲在美國

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); 

}

回答

0

有一個在STM32F103參考手冊和TAOS數據表不同USART時序圖。 我認爲他們不會在USART模式下一起工作。

作爲一個想法,您可以嘗試使用UART而不是USART。並使用MCO或其他時鐘源爲設備提供時鐘。我認爲它應該工作。

這種情況下你可以用定時器做所有的延遲。

PS:但是還有一個問題需要解決,就是將UART的輸出與時鐘源同步。我需要更仔細地閱讀stm32手冊,告訴你如何去做。我會在以後做

+0

謝謝,我再讀一遍,請告訴我,如果你發現,我會等着... – Mahtab

+0

我有一個奇怪的解決方案。它應該在理論上工作,但我無法測試它。首先是硬件。你應該計算可以接受UART接收器的最大頻率。應該是大約1MBit/s。 其次,你必須在這個頻率上配置定時器,使時鐘信號的傳感器,並把它連接到MCU 的SPI CLK 是的,你必須使用SPI發送同步數據 SPI MISO引腳應連接到傳感器串行輸入 – picoworm

+0

SPI必須配置爲從機並具有16位數據幀。您必須將SPI寄存器設置爲0xffff才能使IDLE USART輸出。當你需要發送數據時,你必須建立1個起始位,而不是數據,然後停止位,這應該需要10位SPI數據寄存器,6位保持設置爲1 – picoworm