Files
2025-12-03 11:12:34 +08:00

649 lines
22 KiB
C

#ifdef SUPPORT_MS_EXTENSIONS
#pragma bss_seg(".spi_test.data.bss")
#pragma data_seg(".spi_test.data")
#pragma const_seg(".spi_test.text.const")
#pragma code_seg(".spi_test.text")
#endif
#include "system/includes.h"
#include "media/includes.h"
#include "spi.h"
#include "generic/log.h"
#include "gpio.h"
#include "clock.h"
#include "asm/wdt.h"
#define LOG_TAG "[spi_demo]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
#define LOG_CLI_ENABLE
#define LOG_DUMP_ENABLE
#include "debug.h"
/**********************spi master test********************/
#if 1
void spi_master_isr_callback_test(hw_spi_dev spi, enum hw_spi_isr_status sta) //spi isr callback
{
log_info("%s(),spi:%d,sta:%d", __func__, spi, sta);
}
void spi_master_test(hw_spi_dev spi)
{
struct spi_platform_data spix_p_data_test = {
.port = {
IO_PORTA_00, //clk any io
IO_PORTA_01, //do any io
IO_PORTA_06, //di any io
IO_PORTA_03, //d2 any io
IO_PORTA_04, //d3 any io
0xff, //cs any io(主机不操作cs)
},
.role = SPI_ROLE_MASTER,
.mode = SPI_MODE_BIDIR_1BIT,//SPI_MODE_UNIDIR_2BIT,//SPI_MODE_BIDIR_1BIT,
.bit_mode = SPI_FIRST_BIT_MSB,
.cpol = 0,//clk level in idle state:0:low, 1:high
.cpha = 0,//sampling edge:0:first, 1:second
.ie_en = 0, //ie enbale:0:disable, 1:enable
.irq_priority = 3,
.spi_isr_callback = NULL, //spi isr callback
.clk = 1000000L,
};
//init
int ret = spi_open(spi, &spix_p_data_test);
if (ret < 0) {
log_error("spi master init error(%d)!", ret);
}
//dma tx(阻塞等pnd)
u8 spi_tx_buf_test[50];
log_info("spi(%d) master block dma tx test:", spi);
memset(spi_tx_buf_test, 0xa5, sizeof(spi_tx_buf_test));
ret = spi_dma_send(spi, spi_tx_buf_test, 50);
if (ret < 0) {
log_error("spi master dma send error(%d)!", ret);
}
log_info("spi(%d) master block dma tx ok!\n", spi);
spi_deinit(spi);
//init
spix_p_data_test.ie_en = 1;
spix_p_data_test.spi_isr_callback = spi_master_isr_callback_test;
ret = spi_open(spi, &spix_p_data_test);
if (ret < 0) {
log_error("spi master init error(%d)!", ret);
}
//dma tx(中断)
memset(spi_tx_buf_test, 0x39, sizeof(spi_tx_buf_test));
log_info("spi(%d) master irq dma tx test:", spi);
spi_dma_transmit_for_isr(spi, spi_tx_buf_test, sizeof(spi_tx_buf_test), 0); //rw:1-rx; 0-tx
while (hw_spix_get_isr_status(spi) != SPI_TX_FINISH) {
wdt_clear();
}
log_info("spi(%d) master irq dma tx ok!(len:%d)\n", spi, hw_spix_get_isr_len(spi));
//dma rx(中断)
log_info("spi(%d) master irq dma rx test:", spi);
memset(spi_tx_buf_test, 0x39, sizeof(spi_tx_buf_test));
spi_dma_transmit_for_isr(spi, spi_tx_buf_test, sizeof(spi_tx_buf_test), 1); //rw:1-rx; 0-tx
while (hw_spix_get_isr_status(spi) != SPI_RX_FINISH) {
wdt_clear();
}
log_info("spi(%d) master irq dma rx ok!len:%d\n", spi, hw_spix_get_isr_len(spi));
log_info_hexdump(spi_tx_buf_test, sizeof(spi_tx_buf_test));
//byte 全双工(SPI_MODE_BIDIR_1BIT),中断
log_info("spi(%d) master irq byte tx&rx test:", spi);
hw_spix_irq_change_callback(spi, NULL);
u8 spi_rx_buf_test[100];
memset(spi_rx_buf_test, 0, sizeof(spi_rx_buf_test));
memset(spi_tx_buf_test, 0xb6, sizeof(spi_tx_buf_test));
hw_spix_clear_isr_len(spi);//clear len
#if 0 //byte 接口
for (u16 i = 0; i < sizeof(spi_tx_buf_test); i++) {
spi_byte_transmit_for_isr(spi, spi_tx_buf_test[i], spi_rx_buf_test + i, 0); //rw:全双工:0 SPI_TX_FINISH
/* spi_byte_transmit_for_isr(spi, spi_tx_buf_test[i], NULL, 0); //rw:tx:0 SPI_TX_FINISH */
/* spi_byte_transmit_for_isr(spi, NULL, spi_rx_buf_test+ i, 1); //rw:rx:1 SPI_RX_FINISH */
while (hw_spix_get_isr_status(spi) != SPI_TX_FINISH) {
wdt_clear();
}
}
log_info("spi(%d) master byte rx: (len:%d)", spi, hw_spix_get_isr_len(spi));
#else //buf 接口
spi_buf_transmit_for_isr(spi, spi_tx_buf_test, spi_rx_buf_test, sizeof(spi_tx_buf_test), 0);//rw:1-rx; 0-tx,全双工
/* spi_buf_transmit_for_isr(spi, spi_tx_buf_test, NULL, sizeof(spi_tx_buf_test), 0);//rw:1-rx; 0-tx,全双工 */
while (hw_spix_get_isr_status(spi) != SPI_TX_FINISH) {
wdt_clear();
}
log_info("spi(%d) master buf rx: (len:%d)", spi, hw_spix_get_isr_len(spi));
#endif
log_info("spi(%d) master rx: (len:%d)", spi, hw_spix_get_isr_len(spi));
log_info_hexdump(spi_rx_buf_test, sizeof(spi_rx_buf_test));
log_info("spi(%d) master irq byte tx&rx ok\n", spi);
spi_deinit(spi);
while (1) {
wdt_clear();
}
}
#endif
#if 1
/***********************slave test 无cs**************************/
void spi_slave_isr_callback_test1(hw_spi_dev spi, enum hw_spi_isr_status sta) //spi isr callback
{
log_info("%s(),spi:%d,sta:%d", __func__, spi, sta);
}
//固定256长
void spi_slave_test1(hw_spi_dev spi)
{
struct spi_platform_data spix_p_data_test = {
.port = {
IO_PORTA_00, //clk any io
IO_PORTA_01, //do any io
IO_PORTA_02, //di any io
IO_PORTA_03, //d2 any io
IO_PORTA_04, //d3 any io
IO_PORTA_06, //cs any io
},
.role = SPI_ROLE_SLAVE,
.mode = SPI_MODE_UNIDIR_2BIT,//SPI_MODE_BIDIR_1BIT,
.bit_mode = SPI_FIRST_BIT_MSB,
.cpol = 0,//clk level in idle state:0:low, 1:high
.cpha = 0,//sampling edge:0:first, 1:second
.ie_en = 1, //ie enbale:0:disable, 1:enable
.irq_priority = 3,
.spi_isr_callback = NULL, //spi isr callback
.clk = 1000000L,
};
//init
int ret = spi_open(spi, &spix_p_data_test);
if (ret < 0) {
log_error("spi slave init error(%d)!", ret);
}
u16 i = 0;
u8 spi_tx_buf_test[256];
u8 spi_rx_buf_test[256];
memset(spi_rx_buf_test, 0, sizeof(spi_rx_buf_test));
#if 0
//dma rx
hw_spix_irq_change_callback(spi, spi_slave_isr_callback_test1);
log_info("spi(%d) slave dma rx test:", spi);
while (1) { //rx
spi_dma_transmit_for_isr(spi, spi_rx_buf_test, sizeof(spi_rx_buf_test), 1); //rw:1-rx; 0-tx
while (hw_spix_get_isr_status(spi) != SPI_RX_FINISH) {
wdt_clear();
}
log_info("spi(%d) slave dma rx:(len:%d)", spi, hw_spix_get_isr_len(spi));
log_info_hexdump(spi_rx_buf_test, sizeof(spi_rx_buf_test));
/* mdelay(500); */
wdt_clear();
}
#elif 1
//byte rx
#if 0 //byte 接口
log_info("spi(%d) slave byte rx test:", spi);
while (1) { //rx
hw_spix_clear_isr_len(spi);//clear len
for (i = 0; i < sizeof(spi_rx_buf_test); i++) {
spi_byte_transmit_for_isr(spi, 0, spi_rx_buf_test + i, 1); //rw:1-rx; 0-tx
while (hw_spix_get_isr_status(spi) != SPI_RX_FINISH) {
wdt_clear();
}
}
log_info("spi(%d) slave byte rx:(len:%d)", spi, hw_spix_get_isr_len(spi));
log_info_hexdump(spi_rx_buf_test, sizeof(spi_rx_buf_test));
}
#else //buf 接口
log_info("spi(%d) slave buf rx test:", spi);
for (i = 0; i < sizeof(spi_tx_buf_test); i++) {
spi_tx_buf_test[i] = i;
}
while (1) { //tx
hw_spix_clear_isr_len(spi);//clear len
spi_buf_transmit_for_isr(spi, NULL, spi_rx_buf_test, sizeof(spi_rx_buf_test), 1);//rw:1-rx; 0-tx,全双工
while (hw_spix_get_isr_status(spi) != SPI_RX_FINISH) {
wdt_clear();
}
log_info("spi(%d) slave buf rx:(len:%d)", spi, hw_spix_get_isr_len(spi));
log_info_hexdump(spi_rx_buf_test, sizeof(spi_rx_buf_test));
}
#endif
#endif
#if 0
//dma tx
hw_spix_irq_change_callback(spi, spi_slave_isr_callback_test1);
log_info("spi(%d) slave dma tx test:", spi);
for (i = 0; i < sizeof(spi_tx_buf_test); i++) {
spi_tx_buf_test[i] = i;
}
while (1) { //tx
spi_dma_transmit_for_isr(spi, spi_tx_buf_test, sizeof(spi_tx_buf_test), 0); //rw:1-rx; 0-tx
while (hw_spix_get_isr_status(spi) != SPI_TX_FINISH) {
wdt_clear();
}
log_info("spi(%d) slave dma tx ok!(len:%d)", spi, hw_spix_get_isr_len(spi));
}
#else
#if 0 //byte 接口
//byte tx
log_info("spi(%d) slave byte tx test:", spi);
for (i = 0; i < sizeof(spi_tx_buf_test); i++) {
spi_tx_buf_test[i] = i;
}
while (1) { //tx
hw_spix_clear_isr_len(spi);//clear len
for (i = 0; i < sizeof(spi_tx_buf_test); i++) {
spi_byte_transmit_for_isr(spi, spi_tx_buf_test[i], NULL, 0);//rw:1-rx; 0-tx
while (hw_spix_get_isr_status(spi) != SPI_TX_FINISH) {
wdt_clear();
}
}
log_info("spi(%d) slave byte tx ok!(len:%d)", spi, hw_spix_get_isr_len(spi));
}
#else //buf 接口
log_info("spi(%d) slave buf tx test:", spi);
memset(spi_rx_buf_test, 0, sizeof(spi_rx_buf_test));
for (i = 0; i < sizeof(spi_tx_buf_test); i++) {
spi_tx_buf_test[i] = i;
}
while (1) { //tx
hw_spix_clear_isr_len(spi);//clear len
/* spi_buf_transmit_for_isr(spi, spi_tx_buf_test, spi_rx_buf_test, sizeof(spi_tx_buf_test), 0);//rw:1-rx; 0-tx,全双工 */
spi_buf_transmit_for_isr(spi, spi_tx_buf_test, NULL, sizeof(spi_tx_buf_test), 0);//rw:1-rx; 0-tx,全双工
while (hw_spix_get_isr_status(spi) != SPI_TX_FINISH) {
wdt_clear();
}
log_info("spi(%d) slave buf tx ok!(len:%d)", spi, hw_spix_get_isr_len(spi));
}
#endif
#endif
}
/***********************slave test cs**************************/
//cs需双边沿,spi驱动不支持cs模式
void spi_slave_isr_callback_test2(hw_spi_dev spi, enum hw_spi_isr_status sta) //spi isr callback
{
log_info("%s(),spi:%d,sta:%d", __func__, spi, sta);
}
static volatile u8 spi_finish_flag = 0;
static int spi_s_dma_data_len_test = 0;
void gpio_irq_callback_p_test(enum gpio_port port, u32 pin, enum gpio_irq_edge edge)
{
if (edge == PORT_IRQ_EDGE_FALL) {
spi_finish_flag = 0;
spi_s_dma_data_len_test = 0;
} else if (edge == PORT_IRQ_EDGE_RISE) {
spi_finish_flag = 1;
spi_s_dma_data_len_test = -hw_spix_slave_get_dma_len(1);
}
/* printf("port%d.%d:%d-cb1\n", port, pin, edge); */
/* printf("flag:%d,len:%d\n", spi_finish_flag, spi_s_dma_data_len_test); */
}
void spi_slave_cs_test(hw_spi_dev spi)
{
struct spi_platform_data spix_p_data_test = {
.port = {
IO_PORTA_00, //clk any io
IO_PORTA_01, //do any io
IO_PORTA_02, //di any io
IO_PORTA_03, //d2 any io
IO_PORTA_04, //d3 any io
IO_PORTA_06, //cs any io
},
.role = SPI_ROLE_SLAVE,
.mode = SPI_MODE_UNIDIR_2BIT,//SPI_MODE_BIDIR_1BIT,
.bit_mode = SPI_FIRST_BIT_MSB,
.cpol = 0,//clk level in idle state:0:low, 1:high
.cpha = 0,//sampling edge:0:first, 1:second
.ie_en = 0, //ie enbale:0:disable, 1:enable
.irq_priority = 3,
.spi_isr_callback = NULL, //spi isr callback
.clk = 1000000L,
};
//init cs(cs 中断)
struct gpio_irq_config_st gpio_irq_config_test = {
.pin = PORT_PIN_6,
.irq_edge = PORT_IRQ_ANYEDGE,//双边沿
.callback = gpio_irq_callback_p_test,
};
gpio_irq_config(PORTA, &gpio_irq_config_test);//通信结束
//init spi
int ret = spi_open(spi, &spix_p_data_test);
if (ret < 0) {
log_error("spi slave init error(%d)!", ret);
}
u16 i = 0;
u8 spi_tx_buf_test[256 * 2];
u8 spi_rx_buf_test[256 * 2];
memset(spi_rx_buf_test, 0, sizeof(spi_rx_buf_test));
//dma 只需io双边沿中断
#if 0
//dma rx, len必大于主机通信长
log_info("spi(%d) slave dma rx test:", spi);
while (1) { //rx
spi_dma_transmit_for_isr(spi, spi_rx_buf_test, 1000000, 1); //rw:1-rx; 0-tx
printf("spi_cnt:%d\n", spi_r_reg_dma_cnt(spi_regs[1]));
while (spi_finish_flag == 0) {
wdt_clear();
}
spi_finish_flag = 0;
log_info("spi(%d) slave dma rx:(len:%d)", spi, spi_s_dma_data_len_test);
log_info_hexdump(spi_rx_buf_test, spi_s_dma_data_len_test);
/* mdelay(500); */
wdt_clear();
}
#elif 0
//dma tx, len必大于主机通信长
log_info("spi(%d) slave dma tx test:", spi);
for (i = 0; i < sizeof(spi_tx_buf_test); i++) {
spi_tx_buf_test[i] = i;
}
while (1) { //tx
spi_dma_transmit_for_isr(spi, spi_tx_buf_test, 1000000, 0); //rw:1-rx; 0-tx
printf("spi_cnt:%d\n", spi_r_reg_dma_cnt(spi_regs[1]));
while (spi_finish_flag == 0) {
wdt_clear();
}
spi_finish_flag = 0;
log_info("spi(%d) slave dma tx ok!(len:%d)", spi, spi_s_dma_data_len_test);
}
#endif
spi_deinit(spi);
//init
spix_p_data_test.ie_en = 1;
spix_p_data_test.mode = SPI_MODE_BIDIR_1BIT;
spix_p_data_test.spi_isr_callback = NULL;
ret = spi_open(spi, &spix_p_data_test);
if (ret < 0) {
log_error("spi slave init error(%d)!", ret);
}
spi_finish_flag = 0;
//byte 需io双边沿中断及spi中断
#if 0
//byte rx
u8 j = 0;
memset(spi_rx_buf_test, 0, sizeof(spi_rx_buf_test));
while (1) { //rx
hw_spix_clear_isr_len(spi);//clear len
#if 0 //byte 接口(每次配置spi)
log_info("spi(%d) slave byte rx test:", spi);
j = 0;
while (1) {
spi_byte_transmit_for_isr(spi, 0, spi_rx_buf_test + j, 1); //rw:1-rx; 0-tx
while (hw_spix_get_isr_status(spi) != SPI_RX_FINISH) {
wdt_clear();
if (spi_finish_flag) {
break;
}
}
j++;
if (spi_finish_flag) {
break;
}
}
log_info("spi(%d) slave byte rx:(len:%d)", spi, hw_spix_get_isr_len(spi));
#else //buf 接口(配置一次spi, len必大于主机通信长)
log_info("spi(%d) slave buf rx test:", spi);
spi_buf_transmit_for_isr(spi, NULL, spi_rx_buf_test, 1000000, 1);//rw:1-rx; 0-tx,全双工
while (hw_spix_get_isr_status(spi) != SPI_RX_FINISH) {
wdt_clear();
if (spi_finish_flag) {
break;
}
}
log_info("spi(%d) slave buf rx:(len:%d)", spi, hw_spix_get_isr_len(spi));
#endif
spi_finish_flag = 0;
log_info_hexdump(spi_rx_buf_test, hw_spix_get_isr_len(spi));
}
#else
//byte 全双工 tx&rx
for (i = 0; i < sizeof(spi_tx_buf_test); i++) {
spi_tx_buf_test[i] = i;
}
memset(spi_rx_buf_test, 0, sizeof(spi_rx_buf_test));
while (1) { //tx
hw_spix_clear_isr_len(spi);//clear len
#if 0 //byte 接口(每次配置spi)
u8 j = 0;
log_info("spi(%d) slave byte tx&rx test:", spi);
while (1) {
spi_byte_transmit_for_isr(spi, spi_tx_buf_test[j], spi_rx_buf_test + j, 0); //rw:1-rx; 0-tx
while (hw_spix_get_isr_status(spi) != SPI_TX_FINISH) {
wdt_clear();
if (spi_finish_flag) {
break;
}
}
j++;
if (spi_finish_flag) {
break;
}
}
log_info("spi(%d) slave byte tx&rx ok!(len:%d)", spi, hw_spix_get_isr_len(spi));
#else //buf 接口(配置一次spi, len必大于主机通信长)
log_info("spi(%d) slave buf tx&rx test:", spi);
spi_buf_transmit_for_isr(spi, spi_tx_buf_test, spi_rx_buf_test, 1000000, 0);//rw:1-rx; 0-tx,全双工
while (hw_spix_get_isr_status(spi) != SPI_TX_FINISH) {
wdt_clear();
if (spi_finish_flag) {
break;
}
}
log_info("spi(%d) slave buf tx&rx ok!(len:%d)", spi, hw_spix_get_isr_len(spi));
#endif
spi_finish_flag = 0;
log_info_hexdump(spi_rx_buf_test, hw_spix_get_isr_len(spi));
}
#endif
}
#endif
/**********************spi 主从收发测试,需2个spi********************/
#if 1
void spi_master_isr_callback_test3(hw_spi_dev spi, enum hw_spi_isr_status sta) //spi isr callback
{
log_info("%s(),spi:%d,sta:%d", __func__, spi, sta);
}
void spi_slave_isr_callback_test3(hw_spi_dev spi, enum hw_spi_isr_status sta) //spi isr callback
{
log_info("%s(),spi:%d,sta:%d", __func__, spi, sta);
}
void spi_auto_test(hw_spi_dev spi_master, hw_spi_dev spi_slave)
{
struct spi_platform_data spix_p_data_test_m = {
.port = {
IO_PORTA_00, //clk any io
IO_PORTA_01, //do any io
IO_PORTB_02, //di any io
0xff, //d2 any io
0xff, //d3 any io
0xff, //cs any io(主机不操作cs)
},
.role = SPI_ROLE_MASTER,
.mode = SPI_MODE_BIDIR_1BIT,//SPI_MODE_UNIDIR_2BIT,//SPI_MODE_BIDIR_1BIT,
.bit_mode = SPI_FIRST_BIT_MSB,
.cpol = 0,//clk level in idle state:0:low, 1:high
.cpha = 0,//sampling edge:0:first, 1:second
.ie_en = 1, //ie enbale:0:disable, 1:enable
.irq_priority = 3,
.spi_isr_callback = spi_master_isr_callback_test3, //spi isr callback
.clk = 1000000L,
};
struct spi_platform_data spix_p_data_test_s = {
.port = {
IO_PORTA_04, //clk any io
IO_PORTA_06, //do any io
IO_PORTB_04, //di any io
0xff, //d2 any io
0xff, //d3 any io
0xff, //cs any io(主机不操作cs)
},
.role = SPI_ROLE_SLAVE,
.mode = SPI_MODE_BIDIR_1BIT,//SPI_MODE_UNIDIR_2BIT,//SPI_MODE_BIDIR_1BIT,
.bit_mode = SPI_FIRST_BIT_MSB,
.cpol = 0,//clk level in idle state:0:low, 1:high
.cpha = 0,//sampling edge:0:first, 1:second
.ie_en = 1, //ie enbale:0:disable, 1:enable
.irq_priority = 4,
.spi_isr_callback = spi_slave_isr_callback_test3, //spi isr callback
.clk = 1000000L,
};
log_info("*********************************************");
log_info("spi master(%d) spi slave(%d) irq dma byte test", spi_master, spi_slave);
//init 中断模式
int ret = spi_open(spi_slave, &spix_p_data_test_s);
if (ret < 0) {
log_error("spi slave init error(%d)!", ret);
}
ret = spi_open(spi_master, &spix_p_data_test_m);
if (ret < 0) {
log_error("spi master init error(%d)!", ret);
}
u8 spi_tx_buf_test[50];
u8 spi_rx_buf_test[100];
u8 spi_s_tx_buf_test[50];
u8 spi_s_rx_buf_test[100];
u8 _tx_len = 20;
u8 ii = 20;
//dma tx rx(中断)
#if 1
while (ii--) {
memset(spi_rx_buf_test, 0, sizeof(spi_rx_buf_test));
memset(spi_s_rx_buf_test, 0, sizeof(spi_s_rx_buf_test));
memset(spi_tx_buf_test, 0x50 - ii, sizeof(spi_tx_buf_test));
_tx_len = 50 - ii;
log_info("spi(%d) irq dma tx test:", spi_master);
//主发从收
spi_dma_transmit_for_isr(spi_slave, spi_s_rx_buf_test, _tx_len, 1); //rw:1-rx; 0-tx
spi_dma_transmit_for_isr(spi_master, spi_tx_buf_test, _tx_len, 0); //rw:1-rx; 0-tx
while (hw_spix_get_isr_status(spi_master) != SPI_TX_FINISH) {
wdt_clear();
}
log_info("spi(%d) master irq dma tx ok!(len:%d)\n", spi_master, hw_spix_get_isr_len(spi_master));
while (hw_spix_get_isr_status(spi_slave) != SPI_RX_FINISH) {
wdt_clear();
}
log_info("spi(%d) slave dma rx:(len:%d)", spi_slave, hw_spix_get_isr_len(spi_slave));
log_info_hexdump(spi_s_rx_buf_test, sizeof(spi_s_rx_buf_test));
//主收从发
log_info("spi(%d) slave dma tx test:", spi_slave);
spi_dma_transmit_for_isr(spi_slave, spi_s_rx_buf_test, _tx_len, 0); //rw:1-rx; 0-tx
spi_dma_transmit_for_isr(spi_master, spi_rx_buf_test, _tx_len, 1); //rw:1-rx; 0-tx
while (hw_spix_get_isr_status(spi_slave) != SPI_TX_FINISH) {
wdt_clear();
}
log_info("spi(%d) slave dma tx ok!(len:%d)", spi_slave, hw_spix_get_isr_len(spi_slave));
while (hw_spix_get_isr_status(spi_master) != SPI_RX_FINISH) {
wdt_clear();
}
log_info("spi(%d) master irq dma rx ok!len:%d\n", spi_master, hw_spix_get_isr_len(spi_master));
log_info_hexdump(spi_rx_buf_test, sizeof(spi_rx_buf_test));
wdt_clear();
mdelay(1000);
}
#endif
hw_spix_irq_change_callback(spi_slave, NULL);
ii = 20;
_tx_len = 20;
while (ii--) {
//byte 全双工(SPI_MODE_BIDIR_1BIT),中断
log_info("spi master irq byte tx&rx test:");
memset(spi_rx_buf_test, 0, sizeof(spi_rx_buf_test));
memset(spi_s_rx_buf_test, 0, sizeof(spi_s_rx_buf_test));
memset(spi_tx_buf_test, 0xa0 + ii, sizeof(spi_tx_buf_test));
memset(spi_s_tx_buf_test, 0x40 + ii, sizeof(spi_s_tx_buf_test));
_tx_len = 50 - ii;
//buf 接口
hw_spix_clear_isr_len(spi_master);//clear len
hw_spix_clear_isr_len(spi_slave);//clear len
spi_buf_transmit_for_isr(spi_slave, spi_s_tx_buf_test, spi_s_rx_buf_test, _tx_len, 0);//rw:1-rx; 0-tx or 全双工
spi_buf_transmit_for_isr(spi_master, spi_tx_buf_test, spi_rx_buf_test, _tx_len, 0);//rw:1-rx; 0-tx or 全双工
/* spi_buf_transmit_for_isr(spi, spi_tx_buf_test, NULL, sizeof(spi_tx_buf_test), 0);//rw:1-rx; 0-tx or 全双工 */
while (hw_spix_get_isr_status(spi_master) != SPI_TX_FINISH) {
wdt_clear();
}
log_info("spi(%d) master buf rx: (len:%d)", spi_master, hw_spix_get_isr_len(spi_master));
log_info_hexdump(spi_rx_buf_test, sizeof(spi_rx_buf_test));
while (hw_spix_get_isr_status(spi_slave) != SPI_TX_FINISH) {
wdt_clear();
}
log_info("spi(%d) slave buf rx: (len:%d)", spi_slave, hw_spix_get_isr_len(spi_slave));
log_info_hexdump(spi_s_rx_buf_test, sizeof(spi_s_rx_buf_test));
log_info("spi master irq byte tx&rx ok\n");
/* spi_deinit(spi_slave); */
/* spi_deinit(spi_master); */
wdt_clear();
mdelay(1000);
}
while (1) {
wdt_clear();
mdelay(1000);
}
}
#endif