[TivaC] I2C với cam OV7670

Nguyễn Hữu Sang

Thành Viên PIF
Có ai xài cái OV7670 (có DRAM) này rồi thì cho em hỏi em viết cái code thế này có sai j ko:
Code:
void OV7670Set(uint8_t addr, uint8_t val){
    I2CMasterSlaveAddrSet(I2C1_BASE, OV7670_ADDR, false);
    I2CMasterDataPut(I2C1_BASE, addr);
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);
    while(I2CMasterBusy(I2C1_BASE));
    I2CMasterDataPut(I2C1_BASE, val);
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
    while(I2CMasterBusy(I2C1_BASE));
}
uint32_t OV7670Get(uint32_t addr){
    I2CMasterSlaveAddrSet(I2C1_BASE, OV7670_ADDR, false);
    I2CMasterDataPut(I2C1_BASE, addr);
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_SEND);
    while(I2CMasterBusy(I2C1_BASE));
 
    I2CMasterSlaveAddrSet(I2C1_BASE, OV7670_ADDR+1, true);
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
    while(I2CMasterBusy(I2C1_BASE));
    return(I2CMasterDataGet(I2C1_BASE));
}
datasheet:"The device slave address are 42 for write and 43 for read."
Mà đọc từ thanh ghi PID (product ID, default = 0x76) để kiểm tra thì cứ ra 0xFF, hứng thì 0xFE, còn bỏ qua, cấu hình cho nó lun thì 1 hồi ra như zầy:
Untitled.png

Em cũng bó tay rồi, ai biết chỉ dùm em :2cool_burn_joss_stick:
 

honghiep

Cố Vấn CLB
Staff member
Library I2C của Tiva thì I2CMasterSlaveAddrSet đưa vào địa chỉ 7 bit của I2C - tức là không có bit R/W. Với OV7670 thì là 0x21. Chuyện read/write lớp dưới sẽ add bit này vào khi set argument bReceive của hàm I2CMasterSlaveAddrSet.
 

hmtmarconi

Thành Viên PIF
Anh Hiệp cho em hỏi là em config như vầy, khi em đọc về nó cũng toàn trả về 0xFF thôi
Code:
void BasicConfig()
{
    SysClock = SysCtlClockFreqSet((SYSCTL_OSC_INT | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000);
}
void UARTConfig()
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
 
    GPIOPinConfigure(GPIO_PA0_U0RX);
    GPIOPinConfigure(GPIO_PA1_U0TX);
 
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
 
    UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
 
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
 
    UARTStdioConfig(0, 115200, 16000000);
}
 
void I2CConfig()
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C7);
    SysCtlPeripheralReset(SYSCTL_PERIPH_I2C7);
 
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
 
    GPIOPinTypeI2C(GPIO_PORTD_BASE, GPIO_PIN_1);
    GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_0);
 
    GPIOPinConfigure(GPIO_PD0_I2C7SCL);
        GPIOPinConfigure(GPIO_PD1_I2C7SDA);
 
    I2CMasterInitExpClk(I2C7_BASE, SysClock, false);
}
 
void SCCB_set(uint8_t reg, uint8_t data)
{
  I2CMasterSlaveAddrSet(I2C7_BASE, OV7670_ADDR, false);
  I2CMasterDataPut(I2C7_BASE, reg);
  I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_SEND_START);
  while(I2CMasterBusy(I2C7_BASE));
 
  I2CMasterDataPut(I2C7_BASE, data);
  I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
  while(I2CMasterBusy(I2C7_BASE));
}
 
uint32_t SCCB_get(uint8_t reg)
{
  I2CMasterSlaveAddrSet(I2C7_BASE, OV7670_ADDR, false);
  I2CMasterDataPut(I2C7_BASE, reg);
  I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_SINGLE_SEND);
  while(I2CMasterBusy(I2C7_BASE));
 
  I2CMasterSlaveAddrSet(I2C7_BASE, OV7670_ADDR, true);
  I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
  while(I2CMasterBusy(I2C7_BASE));
 
  return(I2CMasterDataGet(I2C7_BASE));
}
 

2death

Cố Vấn CLB
Staff member
BẠN ƠI CÓ THỂ CHO MÌNH XIN CODE THAM KHẢO ĐIỀU KHIỂN MODULE CAMERA OV7670 NÀY ĐƯỢC KHÔNG BẠN MÌNH LÀM MÃI MÀ KO RA HIC
Xin code thì chắc không ai cho đâu, người ta cũng lười lắm.
Em làm giống như bạn ở trên:
+ Đọc kỹ datasheet.
+ Viết code.
+ Suy nghĩ.
+ Không ra nữa thì post code lên hỏi.

Trên kia có code mẫu rồi mà?
 
Top