1 // Copyright 2023 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 #include "pw_spi_mcuxpresso/spi.h"
16
17 #include "board.h"
18 #include "pw_bytes/array.h"
19 #include "pw_spi/device.h"
20 #include "pw_status/status.h"
21 #include "pw_unit_test/framework.h"
22
23 namespace pw::spi {
24 namespace {
25
26 auto* spi_base = SPI14;
27 constexpr auto kClockNumber = 14;
28 constexpr uint32_t baud_rate_bps = 10000000;
29 constexpr Config configuration{.polarity = ClockPolarity::kActiveHigh,
30 .phase = ClockPhase::kRisingEdge,
31 .bits_per_word = BitsPerWord(8),
32 .bit_order = BitOrder::kMsbFirst};
33
TEST(Configure,ConfigurationSuccess)34 TEST(Configure, ConfigurationSuccess) {
35 McuxpressoInitiator spi(
36 spi_base, CLOCK_GetFlexcommClkFreq(kClockNumber), baud_rate_bps);
37 auto status = spi.Configure(configuration);
38
39 EXPECT_EQ(status, OkStatus());
40 }
41
TEST(ReadWrite,PollingWriteSuccess)42 TEST(ReadWrite, PollingWriteSuccess) {
43 const auto blocking = true;
44 constexpr auto source = bytes::Array<0x01, 0x02, 0x03, 0x04, 0x05>();
45 static auto destination = bytes::Array<0xff, 0xff, 0xff, 0xff, 0xff>();
46
47 McuxpressoInitiator spi(spi_base,
48 CLOCK_GetFlexcommClkFreq(kClockNumber),
49 baud_rate_bps,
50 blocking);
51 auto status = spi.Configure(configuration);
52 ASSERT_EQ(status, OkStatus());
53
54 status = spi.WriteRead(source, destination);
55 EXPECT_EQ(status, OkStatus());
56 }
57
TEST(ReadWrite,IRQWriteSuccess)58 TEST(ReadWrite, IRQWriteSuccess) {
59 const auto blocking = false;
60 constexpr auto source = bytes::Array<0x01, 0x02, 0x03, 0x04, 0x05>();
61 static auto destination = bytes::Array<0xff, 0xff, 0xff, 0xff, 0xff>();
62 McuxpressoInitiator spi(spi_base,
63 CLOCK_GetFlexcommClkFreq(kClockNumber),
64 baud_rate_bps,
65 blocking);
66 auto status = spi.Configure(configuration);
67 ASSERT_EQ(status, OkStatus());
68
69 status = spi.WriteRead(source, destination);
70 EXPECT_EQ(status, OkStatus());
71 }
72
TEST(ReadWrite,WriteOnlySuccess)73 TEST(ReadWrite, WriteOnlySuccess) {
74 const auto blocking = false;
75 constexpr auto source = bytes::Array<0x01, 0x02, 0x03, 0x04, 0x05>();
76 McuxpressoInitiator spi(spi_base,
77 CLOCK_GetFlexcommClkFreq(kClockNumber),
78 baud_rate_bps,
79 blocking);
80 auto status = spi.Configure(configuration);
81 ASSERT_EQ(status, OkStatus());
82
83 status = spi.WriteRead(source, {});
84 EXPECT_EQ(status, OkStatus());
85 }
86
TEST(ReadWrite,UseDeviceWriteOnlySuccess)87 TEST(ReadWrite, UseDeviceWriteOnlySuccess) {
88 const auto blocking = false;
89 constexpr auto source = bytes::Array<0x01, 0x02, 0x03, 0x04, 0x05>();
90 McuxpressoInitiator initiator(spi_base,
91 CLOCK_GetFlexcommClkFreq(kClockNumber),
92 baud_rate_bps,
93 blocking);
94 McuxpressoChipSelector spi_selector(initiator, 0);
95 sync::VirtualMutex spi_lock;
96 sync::Borrowable<Initiator> spi(initiator, spi_lock);
97 Device device(spi, configuration, spi_selector);
98
99 EXPECT_EQ(device.WriteRead(source, {}), OkStatus());
100 }
101 } // namespace
102 } // namespace pw::spi
103