|
附件是部分代码,
大家帮看下,为什么等待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周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|