libero PolarFire soc SPI-DirectC 操作流程

参考文档: SPI-DirectC User Guide 

源码下载:DirectC | Microchip Technology

 

1、dp_top() 函数中 发送指令 读取 idcode ,  dp_G5M_read_idcode() , 确认芯片是否是 

G5SOC_DEVICE_FAMILY 或者是 G5M_DEVICE_FAMILY

2、执行  dp_top_g5m() 函数 →  dp_G5M_perform_action() 函数

3、这个函数 有 多种操作指令 ,分别是

#define DP_NO_ACTION_FOUND                      0u
#define DP_DEVICE_INFO_ACTION_CODE              1u
#define DP_READ_IDCODE_ACTION_CODE              2u
#define DP_ERASE_ACTION_CODE                    3u  // 擦除指令
#define DP_PROGRAM_ACTION_CODE                  4u  // 编程指令
#define DP_VERIFY_ACTION_CODE                   5u  // 校验指令
#define DP_ENC_DATA_AUTHENTICATION_ACTION_CODE  6u // 加密数据校验指令
#define DP_VERIFY_DIGEST_ACTION_CODE            7u 
#define DP_READ_DEVICE_CERTIFICATE_ACTION_CODE  30u
#define DP_ZEROIZE_LIKE_NEW_ACTION_CODE         31u
#define DP_ZEROIZE_UNRECOVERABLE_ACTION_CODE    32u
#define DP_REPROGRAM_INFLIGHT_ACTION_CODE       33u
 
4、编程过程是, 先擦除,然后编程书籍, 最后校验数据, 因此 先看 擦除 函数
                    dp_G5M_erase_action();
5、擦除: 发送 擦除指令 0x01 ,  然后 将 擦除数据 发送出去 , 这里会先读取 数据块 
GXM_NUMBER_OF_BLOCKS_ID = 0x05 , 这个数据块 存储了 擦除的 循环次数 , 每次循环, 发送数据16字节,因此 ,根据擦除数据地址和这里的 擦除次数 来确定了 擦除数据的长度!
 
6、每发送一次擦除数据 ’前‘, 都要发送  指令  G5M_SPI_HWSTATUS = 0x00,  bit 1  
G5_BUSY_BIT 忙闲位 是否 = 1 , 确认是否 空闲 ,读取状态一直忙,则 超时则认为 擦除错误!
 
7、空闲 发送数据 16字节 , 循环, 直到 擦除数据发送完毕
 
8、编程:dp_G5M_program_action() →  dp_G5M_do_program() 函数 , 发送指令 0x01 进入编程模式, 擦除和编程 指令一样的,  进去看都是 发送两个字节,
第一个字节: 0xAE = G5M_SPI_FRAME_INIT  , 第二个字节  0x01
 
9、 和擦除数据一样, 将编程数据 发送过去, 读取状态一直忙,则 超时则认为 编程错误!
 
10、 校验数据,
dp_G5M_do_verify() , 发送指令 0x02 , 再次 发送 编程数据 
 
 
获取状态  dp_G5M_check_hwstatus 函数 , 形参 是 对应 bit 位
 
 
 
 
发送 16 字节后, 如果超时,dp_G5M_get_data_status 函数
则 发送 指令  G5M_SPI_FRAME_STATUS  指令 , 并读取8个字节, 共计传输 9个字节!
 
 
 // 读取 8个字节数据,spi_output_buffer[0] 的 bit 3  是 1  , 则说明 处理数据错误!
    if (spi_output_buffer[0] & 0x4u)
    {
        error_code = DPE_PROCESS_DATA_ERROR;
    }
// 
spi_output_buffer[1]  = 1/2/4/8/127/132/133/134/135
说明 数据 损坏, 估计 SPI 传输过程 发生 错误!
spi_output_buffer[1]  = 3 , 则 说明 密钥 错误;
spi_output_buffer[1]  = 5 , 则 返回级别未满足;
spi_output_buffer[1]  = 6, 编程未使能;
spi_output_buffer[1]  = 7 , 则 DSN binding mismatch;
 
 
后面 还有很多 错误 
 
 
dp_G5M_read_debug_info  发送指令 G5M_SPI_READ_DEBUG_INFO= 0xE7
 

posted on 2026-01-27 12:51  所长  阅读(0)  评论(0)    收藏  举报

导航