完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
模拟MDIO协议,读到数据都是1,大有人模拟过吗,求解答:
void delay(void) { delay_us(1); } void mdio_init(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOC); //开漏输出 //MDIO---PA2 MDC---PC1 gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2); gpio_output_options_set(GPIOA, GPIO_OTYPE_OD, GPIO_OSPEED_200MHZ,GPIO_PIN_2); gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOC, GPIO_OTYPE_OD, GPIO_OSPEED_200MHZ,GPIO_PIN_1); /* BCMMDIO_EN---PB14*/ rcu_periph_clock_enable(RCU_GPIOB); gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_14); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ,GPIO_PIN_14); //on---1, off---0 gpio_bit_set(GPIOB, GPIO_PIN_14); } #if 0 void mdio_init(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOC); /* PA2: ETH_MDIO */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ,GPIO_PIN_2); gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_2); /* PC1: ETH_MDC */ gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ,GPIO_PIN_1); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_1); /* BCMMDIO_EN */ rcu_periph_clock_enable(RCU_GPIOB); gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_14); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_14); //on---0, off---1 gpio_bit_reset(GPIOB, GPIO_PIN_14); } #endif /* 设置MDC为输出引脚,在MDC输出时钟之前设置 */ static void MDC_OUT(void) { gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ,GPIO_PIN_1); } /* 设置MDIO引脚为输出模式 */ static void mdio_output(void) { MDC_L(); /* PA2 MDIO */ gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ, GPIO_PIN_2); delay_us(1); MDC_H(); delay_us(1); } /* 设置MDIO引脚为输入模式 */ static void mdio_input(void) { MDC_L(); /* PA2 MDIO */ gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_2); delay_us(1); MDC_H(); delay_us(1); } //set MDC CLK void set_mdc_val() { MDC_L(); delay_us(1); MDC_H(); delay_us(1); } //set MDIO val void set_mdio_val_bit(uint8_t val) { if( (val&0x1) == 0) gpio_bit_reset(GPIOA, GPIO_PIN_2); else gpio_bit_set(GPIOA, GPIO_PIN_2); } #if 1 /* MDIO发送一个bit的数据,MDIO必须已经被配置为输出 */ static void mdio_bb_send_bit(uint8_t val) { MDC_L(); set_mdio_val_bit(val); delay_us(1); MDC_H(); delay_us(1); // set_mdc_val(); } /* * MDIO发送一个数据,MDIO 必须被配置为输出模式. * value:要发送的数据 * bits:数据的位数 */ static void mdio_bb_send_num(unsigned int value ,int bits) { int i; for(i = bits - 1; i >= 0; i--) mdio_bb_send_bit((value >> i) & 1); } /* MDIO 获取一个bit的数据,MDIO必须已经被配置为输入. */ static int mdio_bb_get_bit(void) { int value; // set_mdc_val(); MDC_L(); delay_us(1); value = GET_MDIO(); MDC_H(); delay_us(1); return value; } /* * MDIO获取一个数据,MDIO 必须被配置为输入模式. * bits:获取数据的位数 * */ static int mdio_bb_get_num(int bits) { int i; int ret = 0; for(i = bits - 1; i >= 0; i--) { ret <<= 1; ret |= mdio_bb_get_bit(); } return ret; } /* MDIO frame format definitions are shown below: Preamble = 32-bit 1's (optional) START = Start of Frame indicated by 00 pattern OP = Opcode (access type) – 00: Address – 01: Write – 11: Read – 10: Post read increment address TA = Turnaround – Z0: Read – 01: Write PRTAD = Physical Address (hardwired) DEVAD = Device Address – 00001: PMA/PMD – 00111: AN Address/Data = 16-bit Address or Data */ /* read: Frame 1: Address (Opcode = 00, PRTAD = 0, Device Address = 1, Address/Data field = 0x8200) Frame 2: Read (Opcode = 11 or 10, PRTAD = 0, Device Address = 1, Address/Data field = data read back from 0x8200) */ uint16_t read_data(uint8_t phy, uint8_t dev, uint16_t reg) { int ret = 0, i = 0; mdio_output(); //第一帧数据,先发地址 /*发送32bit的1,这个帧前缀域不是必须的,某些物理层芯片的MDIO操作就没有这个域*/ for(i = 0; i < 32; i++) mdio_bb_send_bit(1); //start 00 mdio_bb_send_num(0x0, 2); //Opcode = 00 mdio_bb_send_num(0x0, 2); //PRTAD---5bit mdio_bb_send_num(phy,5); //Device---5bit mdio_bb_send_num(dev,5); //TA---0x01-write---2bit mdio_bb_send_num(0x1, 2); //Address---16bit mdio_bb_send_num(reg,16); //第二帧数据 /*发送32bit的1,这个帧前缀域不是必须的,某些物理层芯片的MDIO操作就没有这个域*/ for(i = 0; i < 32; i++) mdio_bb_send_bit(1); //start 00 mdio_bb_send_num(0x0, 2); //Opcode = 10 mdio_bb_send_num(0x10, 2); //PRTAD---5bit mdio_bb_send_num(phy,5); //Device---5bit mdio_bb_send_num(dev,5); mdio_input(); // //TA---0x00-read---2bit // mdio_bb_send_num(0x2, 2); set_mdc_val(); //get data ret = mdio_bb_get_num(16); mdio_output(); // //高阻态 // for(i = 0; i < 32; i++) // mdio_bb_send_bit(1); return ret; } |
|
相关推荐
2个回答
|
|
同问,请问该问题有被解决吗?
|
|
|
|
请问您这个问题解决了吗?我也遇到同样的问题
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式ElfBoard ELF 1板卡-mfgtools烧录流程之烧写方法
473 浏览 0 评论
飞凌嵌入式ElfBoard ELF 1板卡-内核编译之初次编译
700 浏览 0 评论
飞凌嵌入式ElfBoard ELF 1板卡-内核源代码的目录结构和文件说明
623 浏览 0 评论
飞凌嵌入式ElfBoard ELF 1板卡-Linux内核移植之内核简介
1222 浏览 0 评论
非科班也能玩转Android应用,体验QT跨平台能力-迅为RK3568开发板
1081 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 09:13 , Processed in 1.552396 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号