原创 Versaloon + S51/52

2008-7-30 01:39 3987 4 4 分类: MCU/ 嵌入式

S51/S52的支持只使用了USB_TO_XXX接口中的USB_TO_SPI和USB_TO_GPIO。
S51/S52的ISP编程其实很简单,只是一个SPI接口和一个GPIO(用于控制复位信号)。
有一点需要注意,S51/S52是高电平复位,当要撤销复位信号时,应该把IO口设置为输入,而不是输出'0',这样就不会和其他复位源冲突。

进度:
固件和上位机驱动以后测试通过。
已经可以使S52进入编程模式(得到返回的正确数据),之后要做的就比较简单了,按照“图纸”把“椅子”做出来就可以了。

个人感觉底层的实现方式设计的非常优秀,使得应用程序可以做的非常漂亮:
下面这段是进入编程模式的代码:
#define spi_init()       usbtospi_init()
#define spi_fini()       usbtospi_fini()
#define spi_conf(speed)      usbtospi_config(SPI_PORT, (speed), USB_TO_SPI_CPOL_LOW, USB_TO_SPI_CPHA_1EDGE, USB_TO_SPI_MSB_FIRST)
#define spi_io_4(out, in, inpos, inlen)  usbtospi_io(SPI_PORT, (out), (in), 4, (inpos), (inlen))
#define reset_init()      usbtogpio_init()
#define reset_fini()      usbtogpio_fini()
#define reset_output()      usbtogpio_config(RESET_PORT, RESET_PIN, 1)
#define reset_input()      usbtogpio_config(RESET_PORT, RESET_PIN, 0)
#define reset_set()       usbtogpio_out(RESET_PORT, RESET_PIN, RESET_PIN)
#define reset_clr()       reset_input()
#define delay_ms(ms)      usbtodelay_delay((ms), 0)
#define delay_us(us)      usbtodelay_delay(0, (us))


// use frequency
  spi_conf(frequency);


  // toggle reset
  reset_output();
  reset_set();
  delay_ms(100);
  // set to input to release reset, not output '0'
  reset_input();
  delay_ms(30);
  reset_output();
  reset_set();
  delay_ms(10);


  // enter into program mode command
  cmd_buf[0] = 0xAC;
  cmd_buf[1] = 0x53;
  cmd_buf[2] = 0x00;
  cmd_buf[3] = 0x00;
  tmp8 = 0;
  // ret[3] should be 0x69
  spi_io_4(cmd_buf, &tmp8, 3, 1);
  if((ERROR_OK != usbtoxxx_execute_command()) || (0x69 != tmp8)) { LOG_ERROR("fail to enter into program mode, try a slower speed\n"); ret = ERROR_FAIL; goto leave_program_mode; }

上图:
点击看大图

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条