搜索
bottom↓
回复: 1

STM32f103c8t6 操作RTL8367S的寄存器,采用SMI 接口,I2C控制

[复制链接]

出0入0汤圆

发表于 2022-4-3 12:09:40 | 显示全部楼层 |阅读模式
附件是部分代码,

大家帮看下,为什么等待ACK的时候 ,ACK不为0.   搞了好久,都不知道问题出在哪?


void delay_us(u8 time2)   
{
        u8 j=0;  
        while(time2--)
        { j=10;while(j--) ;
        }
}

void MDIO_IN(void)    {GPIO_InitTypeDef  aGPIO_InitStructure;aGPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;aGPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &aGPIO_InitStructure);}
void MDIO_OUT(void)   {GPIO_InitTypeDef  aGPIO_InitStructure;aGPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;aGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;aGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(GPIOA, &aGPIO_InitStructure);}
void MDC_IN(void)     {GPIO_InitTypeDef  bGPIO_InitStructure;bGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;bGPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &bGPIO_InitStructure);}
void MDC_OUT(void)    {GPIO_InitTypeDef  bGPIO_InitStructure;bGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;bGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;bGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(GPIOA, &bGPIO_InitStructure);}

#define MDIO    PAout(2) //SDA
#define MDC     PAout(3) //  SCL      
#define READ_MDIO  PAin(2) //SDA

void SMI_Init(void)
{

    GPIO_InitTypeDef GPIO_InitStructure;       
       
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;          //PA3  mdc
          GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING;   //
          GPIO_Init(GPIOA, &GPIO_InitStructure);                       

                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;          //PA2 mdio
          GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING;    //          
          GPIO_Init(GPIOA, &GPIO_InitStructure);       
               

                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;          //  mdc
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;   //OD输出
          GPIO_Init(GPIOB, &GPIO_InitStructure);                       

                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;          // mdio
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   /*设置引脚速率为50MHz */
          GPIO_Init(GPIOB, &GPIO_InitStructure);                       

          GPIO_ResetBits(GPIOB,GPIO_Pin_8);  // 默认输出低电平
                GPIO_SetBits(GPIOB,GPIO_Pin_9);  // 默认输出高电平               

}

void _smi_start(void)
{
        /* change GPIO pin to Output only */
        MDC_OUT();//pinMode(PIN_SCK, OUTPUT);
        MDIO_OUT();//pinMode(PIN_SDA, OUTPUT);
        /* Initial state: SCK: 0, SDA: 1 */                        
         MDC=0;//digitalWrite(PIN_SCK, LOW);
         MDIO=1;//digitalWrite(PIN_SDA, HIGH);
         delay_us(1);//CLK_DURATION(DELAY);

        /* CLK 1: 0 -> 1, 1 -> 0 */
        MDC=1;//digitalWrite(PIN_SCK, HIGH);
        delay_us(1);//CLK_DURATION(DELAY);
        MDC=0;//digitalWrite(PIN_SCK, LOW);
        delay_us(1);//CLK_DURATION(DELAY);                                       
       
        /* CLK 2: */
        MDC=1;//digitalWrite(PIN_SCK, HIGH);
        delay_us(1);//CLK_DURATION(DELAY);
        MDIO=0;//digitalWrite(PIN_SDA, LOW);
        delay_us(1);//CLK_DURATION(DELAY);
        MDC=0;//digitalWrite(PIN_SCK, LOW);
        delay_us(1);//CLK_DURATION(DELAY);
        MDIO=1;//digitalWrite(PIN_SDA, HIGH);
}
void _smi_writeBit(uint16_t signal, uint32_t bitLen)
{
        for ( ; bitLen > 0; bitLen--) {
                delay_us(1);//CLK_DURATION(DELAY);

                /* prepare data */
                if (signal & (1UL << (bitLen - 1)))
                        MDIO=1;//digitalWrite(PIN_SDA, HIGH);
                else
                        MDIO=0;//digitalWrite(PIN_SDA, LOW);
                delay_us(1);//CLK_DURATION(DELAY);

                /* clocking */
                MDC=1;//digitalWrite(PIN_SCK, HIGH);
                delay_us(1);//CLK_DURATION(DELAY);
                MDC=0;//digitalWrite(PIN_SCK, LOW);
        }
}
void _smi_readBit(uint32_t bitLen, uint32_t *rData)
{
        uint32_t u;

        /* change GPIO pin to Input only */
        MDIO_IN();//pinMode(PIN_SDA, INPUT);

        for (*rData = 0; bitLen > 0; bitLen--) {
                delay_us(1);//CLK_DURATION(DELAY);

                /* clocking */
                MDC=1;//digitalWrite(PIN_SCK, HIGH);
                delay_us(1);//CLK_DURATION(DELAY);
                if(READ_MDIO)
                {u =1;}
                else {u =0;}
                MDC=0;//digitalWrite(PIN_SCK, LOW);

                *rData |= (u << (bitLen - 1));
        }
        /* change GPIO pin to Output only */
        MDIO_OUT();//pinMode(PIN_SDA, OUTPUT);
}

void _smi_stop(void)
{
        delay_us(1);                //CLK_DURATION(DELAY);
        MDIO=0;                  //digitalWrite(PIN_SDA, LOW);
        MDC=1;                  //digitalWrite(PIN_SCK, HIGH);
        delay_us(1);             //CLK_DURATION(DELAY);
        MDIO=1;               //digitalWrite(PIN_SDA, HIGH);
        delay_us(1);           //CLK_DURATION(DELAY);
        MDC=1;             //digitalWrite(PIN_SCK, HIGH);
        delay_us(1);           //CLK_DURATION(DELAY);
        MDC=0;              //digitalWrite(PIN_SCK, LOW);
        delay_us(1);            //CLK_DURATION(DELAY);
        MDC=1;            //digitalWrite(PIN_SCK, HIGH);

        /* add a click */
        delay_us(1);            //CLK_DURATION(DELAY);
        MDC=0;            //digitalWrite(PIN_SCK, LOW);
        delay_us(1);               //CLK_DURATION(DELAY);
        MDC=1;                //digitalWrite(PIN_SCK, HIGH);

        /* change GPIO pin to Input only */
        MDIO_IN();            //pinMode(PIN_SDA, INPUT);
        MDC_IN();             //pinMode(PIN_
}
void _smi_writeBit(uint16_t signal, uint32_t bitLen)
{
        for ( ; bitLen > 0; bitLen--) {
                delay_us(1);//CLK_DURATION(DELAY);

                /* prepare data */
                if (signal & (1UL << (bitLen - 1)))
                        MDIO=1;//digitalWrite(PIN_SDA, HIGH);
                else
                        MDIO=0;//digitalWrite(PIN_SDA, LOW);
                delay_us(1);//CLK_DURATION(DELAY);

                /* clocking */
                MDC=1;//digitalWrite(PIN_SCK, HIGH);
                delay_us(1);//CLK_DURATION(DELAY);
                MDC=0;//digitalWrite(PIN_SCK, LOW);
        }
}
void _smi_readBit(uint32_t bitLen, uint32_t *rData)
{
        uint32_t u;

        /* change GPIO pin to Input only */
        MDIO_IN();//pinMode(PIN_SDA, INPUT);

        for (*rData = 0; bitLen > 0; bitLen--) {
                delay_us(1);//CLK_DURATION(DELAY);

                /* clocking */
                MDC=1;//digitalWrite(PIN_SCK, HIGH);
                delay_us(1);//CLK_DURATION(DELAY);
                if(READ_MDIO)
                {u =1;}
                else {u =0;}
                MDC=0;//digitalWrite(PIN_SCK, LOW);

                *rData |= (u << (bitLen - 1));
        }
        /* change GPIO pin to Output only */
        MDIO_OUT();//pinMode(PIN_SDA, OUTPUT);
}

void _smi_stop(void)
{
        delay_us(1);//CLK_DURATION(DELAY);
        MDIO=0;//digitalWrite(PIN_SDA, LOW);
        MDC=1;//digitalWrite(PIN_SCK, HIGH);
        delay_us(1);//CLK_DURATION(DELAY);
        MDIO=1;//digitalWrite(PIN_SDA, HIGH);
        delay_us(1);//CLK_DURATION(DELAY);
        MDC=1;//digitalWrite(PIN_SCK, HIGH);
        delay_us(1);//CLK_DURATION(DELAY);
        MDC=0;//digitalWrite(PIN_SCK, LOW);
        delay_us(1);//CLK_DURATION(DELAY);
        MDC=1;//digitalWrite(PIN_SCK, HIGH);

        /* add a click */
        delay_us(1);//CLK_DURATION(DELAY);
        MDC=0;//digitalWrite(PIN_SCK, LOW);
        delay_us(1);//CLK_DURATION(DELAY);
        MDC=1;//digitalWrite(PIN_SCK, HIGH);

        /* change GPIO pin to Input only */
        MDIO_IN();//pinMode(PIN_SDA, INPUT);
        MDC_IN();//pinMode(PIN_SCK, INPUT);
}


////////////////////////////
uint32_t smi_read(uint32_t mAddrs)
{
        uint32_t rawData = 0, rData = 0, ACK = 0;
        uint8_t con;
volatile        uint8_t ret_ok=0;

        _smi_start();                                /* Start SMI */
        _smi_writeBit(0x0b, 4);                        /* CTRL code: 4'b1011 for RTL8370 */
        _smi_writeBit(0x4, 3);                        /* CTRL code: 3'b100 */
        _smi_writeBit(0x1, 1);                        /* 1: issue READ command */

        con = 0;
        do {
                con++;
                _smi_readBit(1, &ACK);                /* ACK for issuing READ command */
        } while ((ACK != 0) && (con < ack_timer));

        if (ACK != 0)  ret_ok=1;

        _smi_writeBit((mAddrs & 0xff), 8);        /* Set reg_addr[7:0] */

        con = 0;
        do {
                con++;
                _smi_readBit(1, &ACK);                /* ACK for setting reg_addr[7:0] */
        } while ((ACK != 0) && (con < ack_timer));

        if (ACK != 0)  ret_ok=1;

        _smi_writeBit((mAddrs >> 8), 8);        /* Set reg_addr[15:8] */

        con = 0;
        do {
                con++;
                _smi_readBit(1, &ACK);                /* ACK by RTL836x */
        } while ((ACK != 0) && (con < ack_timer));

        if (ACK != 0)  ret_ok=1;

        _smi_readBit(8, &rawData);                /* Read DATA [7:0] */
        rData = rawData & 0xff;

        _smi_writeBit(0x00, 1);                        /* ACK by CPU */
        _smi_readBit(8, &rawData);                /* Read DATA [15: 8] */
        _smi_writeBit(0x01, 1);                        /* ACK by CPU */

        rData |= (rawData << 8);

        _smi_stop();

        return rData;
}
////////////////////////////////////////////////
void smi_write(uint32_t mAddrs, uint32_t rData)
{
        int8_t con;
        uint32_t ACK = 0;
volatile        int8_t ret_ok1=0;

        _smi_start();                                /* Start SMI */
        _smi_writeBit(0x0b, 4);                        /* CTRL code: 4'b1011 for RTL836x */
        _smi_writeBit(0x4, 3);                        /* CTRL code: 3'b100 */
        _smi_writeBit(0x0, 1);                        /* 0: issue WRITE command */

        con = 0;
        do {
                con++;
                _smi_readBit(1, &ACK);                /* ACK for issuing WRITE command */
        } while ((ACK != 0) && (con < ack_timer));

        if (ACK != 0) ret_ok1=1;

        _smi_writeBit((mAddrs & 0xff), 8);        /* Set reg_addr[7:0] */

        con = 0;
        do {
                con++;
                _smi_readBit(1, &ACK);                /* ACK for setting reg_addr[7:0] */
        } while ((ACK != 0) && (con < ack_timer));

        if (ACK != 0) ret_ok1=1;

        _smi_writeBit((mAddrs >> 8), 8);        /* Set reg_addr[15:8] */

        con = 0;
        do {
                con++;
                _smi_readBit(1, &ACK);                /* ACK or setting reg_addr[15:8] */
        } while ((ACK != 0) && (con < ack_timer));

        if (ACK != 0) ret_ok1=1;

        _smi_writeBit(rData & 0xff, 8);                /* Write Data [7:0] out */

        con = 0;
        do {
                con++;
                _smi_readBit(1, &ACK);                /* ACK for writting data [7:0] */
        } while ((ACK != 0) && (con < ack_timer));

        if (ACK != 0) ret_ok1=1;

        _smi_writeBit(rData >> 8, 8);                /* Write Data [15:8] out */

        con = 0;
        do {
                con++;
                _smi_readBit(1, &ACK);                /* ACK for writting data [15:8] */
        } while ((ACK != 0) && (con < ack_timer));

        if (ACK != 0) ret_ok1=1;

        _smi_stop();
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2022-4-3 12:11:25 | 显示全部楼层
void MDIO_IN(void)    {GPIO_InitTypeDef  aGPIO_InitStructure;aGPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;aGPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &aGPIO_InitStructure);}


这个配置为
void MDIO_IN(void)    {GPIO_InitTypeDef  aGPIO_InitStructure;aGPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;aGPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU; GPIO_Init(GPIOA, &aGPIO_InitStructure);}

仍然不行。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-9 03:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表