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; }
上图:
文章评论(0条评论)
登录后参与讨论