This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430FR5969驱动OV7725时SCCB的波形图

Other Parts Discussed in Thread: MSP430FR5969

MSP430FR5969驱动OV7725时SCCB图.zip请各路大神指教,从时序图上看,先是开始信号,然后写地址0x42,再是写寄存器0x12,最后是写内容为0x80,3相写应该是没有问题的,然后是2相写和2相读,先是写0x42和0x1c从时序图上看SDA的信号和SCL的信号应该是符合SCCB协议的,然后停止,再开始2相读,首先写0x43,再把SDA作为输入的时候为什么检测不到寄存器的值呀,在电脑端上用reg变量来接收该寄存器的值仍然是随机的,各种数值都有,请各路大神看看是错在哪了!!!谢谢,如果可以的话可以加我QQ:1187174926,在线等,谢谢!!!

  • 最近在使用MSP430FR5969的板子驱动OV7725,在第一步用SCCB总线写和读寄存器的时候总是有错误,现在我也不知道是没写进去还是读不到寄存器的内容,每次读厂家ID的时候都是0或者一些随机的值!

    IIC.c

    #include "driverlib.h"
    #include "iic.h"
    #include "intrinsics.h"

    void Delay50us(void)
    {//delay in hardware
    TA0CCR0 = 50;
    TA0CTL = TASSEL__SMCLK | MC__UP; // SMCLK, UP mode
    while(TA0R < 48) {}
    TA0CTL &= ~MC__STOP;
    }

    void Delay5ms(void)
    {
    unsigned int n = 560;
    while (n--);
    }

    void IIC_Init(void){
    //430软件模拟IIC的IO口初始化
    P1DIR |= BIT6;
    //GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN6); //SDA 6
    P1DIR |= BIT7;
    //GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN7); //SCL 7
    IIC_SCL_OH;
    IIC_SDA_OH;
    }

    void IIC_Start(void){
    SDA_OUT();
    IIC_SDA_OH;
    IIC_SCL_OH;
    Delay50us();
    IIC_SDA_OL;
    Delay50us();
    IIC_SCL_OL;
    }


    void IIC_Stop(void){
    SDA_OUT();
    IIC_SCL_OL;
    IIC_SDA_OL;
    Delay50us();
    IIC_SCL_OH;
    IIC_SDA_OH;
    Delay50us();
    }

    //init NA bit
    void init_NA(void)
    {
    Delay50us();
    IIC_SDA_OH;
    IIC_SCL_OH;
    Delay50us();

    IIC_SCL_OL;
    Delay50us();
    IIC_SDA_OL;
    Delay50us();
    }

    //wait ack ????????????????????????????????????????????????
    uint8_t IIC_Wait_Ack(void)
    {
    /* uint8_t res;
    SDA_IN();
    Delay50us();
    IIC_SCL_OH;
    Delay50us();
    if(READ_SDA) res = 1;//SDA=1发送失败,返回1
    else res = 0;
    IIC_SCL_OL;
    SDA_OUT();
    Delay50us();
    return res;*/

    uint8_t ucErrTime=0;
    SDA_IN();Delay50us();
    //IIC_SDA_OH;Delay50us();
    IIC_SCL_OH;Delay50us();
    while(READ_SDA)
    {
    ucErrTime++;
    if(ucErrTime>250)
    {
    IIC_Stop();
    return 1;
    }
    }
    IIC_SCL_OL;
    SDA_OUT();
    return 0;
    }

    //0:write successly,1:write failed
    //dat:the value we want to write
    uint8_t IIC_Write_Byte(uint8_t dat)
    {
    uint8_t t;
    uint8_t temp;
    SDA_OUT();
    IIC_SCL_OL;
    for(t=0;t<8;t++)
    {
    temp = (dat&0x80)>>7;
    if(temp){
    IIC_SDA_OH;
    }
    else{
    IIC_SDA_OL;
    }
    dat<<=1;
    Delay50us();
    IIC_SCL_OH;
    Delay50us();
    IIC_SCL_OL;
    Delay50us();
    }
    return IIC_Wait_Ack();
    }

    //return 0:write successly,1:write failed
    //reg: register address,data:Value we want to write to reg
    uint8_t IIC_Write_Reg(uint8_t reg, uint8_t data)
    {
    uint8_t res = 0;
    IIC_Start();
    if(IIC_Write_Byte(SlaveAddress_wr)) res = 1;
    Delay50us();
    if(IIC_Write_Byte(reg)) res = 1;
    Delay50us();
    if(IIC_Write_Byte(data)) res = 1;
    Delay50us();
    __no_operation();
    IIC_Stop();
    return res;
    }

    //the register's value will be renturn
    uint8_t IIC_Read_Byte()
    {
    uint8_t i,receive=0;
    SDA_IN();
    IIC_SCL_OL;
    for(i=0;i<8;i++ )
    {
    Delay50us();
    IIC_SCL_OH;
    receive<<=1;
    if(READ_SDA)receive++;
    Delay50us();
    IIC_SCL_OL;
    }
    SDA_OUT();
    return receive;
    }

    //register value will be return
    //reg:register address
    uint8_t IIC_Read_Reg(uint8_t reg)
    {
    uint8_t res=0;
    IIC_Start();
    if(IIC_Write_Byte(SlaveAddress_wr)) return 1;
    Delay50us();//_NOP;

    if(IIC_Write_Byte(reg)) return 1;
    IIC_Stop();

    Delay50us();

    IIC_Start();
    if(IIC_Write_Byte(SlaveAddress_rd))
    return 1;
    Delay50us();
    res=IIC_Read_Byte();
    init_NA();
    IIC_Stop();
    return res;
    }

    IIC.h

    #ifndef SYS_IIC_IIC_H_
    #define SYS_IIC_IIC_H_
    #include "inc/hw_memmap.h"

    #define SlaveAddress_rd 0x43
    #define SlaveAddress_wr 0x42

    #define IIC_SCL_OL GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN7) //RST IO口输出低电平 P1OUT &= ~BIT7
    #define IIC_SCL_OH GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN7) //RST IO口输出高电平 P1OUT |= BIT7

    #define IIC_SDA_OL GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN6) //DC IO口输出低电平 P1OUT &= ~BIT6
    #define IIC_SDA_OH GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN6) //DC IO口输出高电平 P1OUT |= BIT6

    #define SDA_OUT() GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN6) //SDA
    #define SDA_IN() GPIO_setAsInputPin(GPIO_PORT_P1,GPIO_PIN6) //SDA

    #define READ_SDA GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN6)
    //#define READ_SDA (P1IN&BIT6)>>6 //0100 0000


    void Delay50us(void );
    void Delay5ms(void);

    void IIC_Init(void);
    void IIC_Start(void);
    void IIC_Stop(void);

    uint8_t IIC_Wait_Ack(void);//wait for dont care bit
    void init_NA(void);

    uint8_t IIC_Write_Byte(uint8_t dat);
    uint8_t IIC_Write_Reg(uint8_t reg, uint8_t data);

    uint8_t IIC_Read_Byte();
    uint8_t IIC_Read_Reg(uint8_t reg);


    #endif

  • 这个我看过了,不行......我要用软件模拟SCCB,在确认SCCB通信是否OK的时候,总是出错,用示波器看了一下波形,在写(0x12,0x80)的时候波形都是正确的,但是在读的时候,2相写和两相读的第一个发送读地址的波形都是正确的,但是读到的内容是看不到的,然而开断点看读寄存器(厂家ID寄存器)的值是一直在变化的...
  • www.rpg.fi/.../
    这个里面的详细说明也没用了?
    你手里有这个超值系列的板子吗?在这个板子上试试。如果可以,再考虑时钟和移植问题
  • 我手里有STM32ZET6的板子,在32上是可以跑的通的,而且我用示波器看了波形图,写信号的时序是对的,但是在读的最后一相就没有值了